asp.net媒体保护

asp.net媒体保护,asp.net,security,media,Asp.net,Security,Media,有人知道为asp.net保护介质的好做法吗 我需要托管各种媒体,这些媒体需要获得查看特定图像/视频的权限。i、 e.特定用户可能有或可能没有查看媒体文件的权限,并且这一事实可能会随时更改 我不在乎他们是否可以下载他们可以访问的媒体文件,我只是不想让他们知道他们不应该访问的项目 我已经考虑过url混淆-这对我来说似乎很蹩脚 我有经过表单验证的用户(我不愿意更改) 我希望保持媒体文件文件夹结构与权限无关。构建一个所有媒体都必须通过的HttpHandler。然后,在检索文件并将其发送给用户之前,您可以

有人知道为asp.net保护介质的好做法吗

我需要托管各种媒体,这些媒体需要获得查看特定图像/视频的权限。i、 e.特定用户可能有或可能没有查看媒体文件的权限,并且这一事实可能会随时更改

我不在乎他们是否可以下载他们可以访问的媒体文件,我只是不想让他们知道他们不应该访问的项目

我已经考虑过url混淆-这对我来说似乎很蹩脚

我有经过表单验证的用户(我不愿意更改)


我希望保持媒体文件文件夹结构与权限无关。

构建一个所有媒体都必须通过的HttpHandler。然后,在检索文件并将其发送给用户之前,您可以执行您想要的任何验证。将所有媒体保留在wwwroot主路径之外,或使用权限拒绝访问该文件夹

有关此主题的更多信息,请单击此处:


我建议用一个表格来存放每个用户都可以访问的文件:

UserID int
FileID varchar
然后,为您的文件创建一个表:

FileID    UniqueIdentifier
FileType  char(4)  <- so you know which extension to use.
etc...
FileID唯一标识符

FileType char(4)我使用这样的xml文件来设置哪些用户/组可以访问文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
    <!ELEMENT file ANY>
    <!ATTLIST file name ID #REQUIRED>
]>
<root>
    <file name="file.doc" users="155,321" groups="grp5" />
    <file name="file2.doc" users="321" groups="" />
</root>
,然后我调用一个函数

 HasAccess(Context.User, xnFile); 
它检查用户是否已登录并比较权限,如果该用户可以拥有该文件,我将从磁盘读取文件并用

FileInfo thisFile = new FileInfo(secretLocation + wantedFile);
Response.Clear();
Response.Buffer = false;
Response.BufferOutput = false;
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Length", thisFile.Length.ToString());
Response.AddHeader("Content-disposition", "filename=" + thisFile.Name);
Response.ContentType = "application/none";
Response.WriteFile(secretLocation + wantedFile);
Response.Close();
Response.End();
Response.ClearContent();
Response.ClearHeaders();

实际上,现在我有一千多个文件,我考虑将文件数据写入数据库,因为XML在5年内两次损坏,可能是由于崩溃或同时使用。

brownpaperpackage.aspx?id={guid}

在media.aspx的加载事件中,您验证用户是否经过身份验证,然后验证用户是否有权查看媒体,如果他们有权查看,则将媒体作为流加载,并将其提供给页面的响应,如图所示

为什么要这样做?它编码简单,您可以从ASP.NET和IIS的身份验证服务中获得所有好处,您可以从中找到请求媒体的用户。将该用户映射到媒体对象的访问列表非常简单。页面的请求对象就在那里。您还隐藏了媒体的名称,因此无法从URL中分辨出发生了什么

如何防止人们直接访问您的媒体?您的媒体文件不能存储在IIS虚拟目录中。如果是的话,可以直接下载。您可以将它们作为字节数组(blob)存储在数据库中,也可以将它们存储在web虚拟目录之外的磁盘上。用户必须通过ASP.NET才能访问这些文件

您如何跟踪哪些用户可以访问哪些媒体?您可以通过asp.net成员身份跟踪您的用户。这意味着每个用户在aspnet_users表中都有一个ID。使用id和文件名(或包含实际介质的blob)为介质创建一个表。然后您只需要创建第三个表来连接这两个表。此表将包含用户id和媒体id,表示此用户可以查看此媒体。使用用户id(来自asp.net成员)和媒体id(来自URL),您只需

select count(*) from UserMedia where UserId = @UserGuid and MediaId = @MediaIdFromUrl
如果计数>0,用户可以查看媒体

您将如何使用URL的示例:

<asp:image 
  runat="server" 
  ImageUrl="brownpaperpackage.aspx?id=53a2ea4(snip)76ca8b" />

来自您在Spikolynn回答中的评论


我很困惑——这和混淆有什么不同?一个经过身份验证的用户是否能够与另一个经过身份验证但未经授权的用户共享一个映像(他们被授权使用)

我猜您试图阻止未经授权的媒体共享

这是许多公司(微软、苹果、IBM等)投入大量资金解决的问题解决方案是DRM,现在他们正在删除它,因为失败了

因此,我的答案是,如果用户愿意做出一些努力来避免共享,您就不能阻止共享


你可以通过应用一些技巧,如SpikolynnLusid在他们的答案中解释,让诚实的人保持诚实。

在猜测文件名的情况下,避免不一致是很简单的。如果用户合谋共享文件名,那么您是正确的。因此,它是否适用取决于场地的性质。儿童音乐网站?算了吧。一个公司网站,里面有来自不同设计公司的竞争作品?很好。一家公司的人建议对敏感数据使用这种技术。他们开始向这个方向移动。我在一个小时内演示了媒体文件的不安全提取。如果不安全,就不安全。有趣的是,您是如何获得文件的标识的?他们使用的是唯一标识符吗?我想知道更多,因为我有一些非常低安全性的文件,我用这种方式隐藏起来(我真的不在乎是否有人看到它们,我只是不想让他们容易猜到)。哈哈-这就像用几个核弹把世贸中心夷为平地,而你可以更容易、更精确地用一些铝热剂。。。说真的-也有公共图像-该技术应该只适用于特定的文件/文件夹。。。K那么,你在你的web.config中这样说并不能完全满足你的要求?然后,您可以使用当前的身份验证方案逐个授权对/protected/任何内容的任何点击。最好的部分是,您不必依靠用户篡改URL来访问其他文件。强制处理程序要求用户进行身份验证,然后在数据库中执行检查以确定他们是否拥有该文件的权限。如果不共享登录名,共享URL甚至无法工作。这真的不是一个繁重的解决方案——这是一个正确的方法,因为它清晰、简单、轻巧+此解决方案为1+1。我不确定这个解决方案是否值得
<asp:image 
  runat="server" 
  ImageUrl="brownpaperpackage.aspx?id=53a2ea4(snip)76ca8b" />