有谁知道保护媒体asp.net的好的做法呢?

我需要主机的各种需要的权限的视图的特定图像/视频媒体。即一个特定的用户可以或可以不具有权限浏览媒体文件。 - 并且该事实可在飞行中改变

我不在乎,如果他们可以下载他们要访问的媒体文件,我只是不希望他们甚至不知道他们不应该访问的项目。

我已经考虑URL混淆 - 这似乎很跛脚我

我有形式认证的用户(我不愿意改变这一点)。

我想保持该媒体文件的文件夹结构无关的权限。

有帮助吗?

解决方案

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

有关这个主题的更多资讯:

http://www.15seconds.com/Issue/020417.htm

其他提示

我使用这样的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>

文件存储上述HTTP根所以它们不能被URL进行访问。

当一个用户试图访问GetFile.aspx?文件= FILE.DOC予加载XML,得到符合

XmlNode xnFile= XML.GetElementById(wantedFile);

,然后我调用一个函数

 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年内损坏的两倍,可能是由于崩溃或同时使用。

从Spikolynn回答您的评论

  

我疑惑 - 这怎么不是混淆不同?将已认证的用户能够与另一认证但未经授权的用户共享的图像(其被授权)?

我猜你尝试防止未经授权的共享的媒体

这是一些很多公司(如微软,苹果,IBM等)已经把大量的资金来解决的。的将溶液DRM 下,现在他们除去它,因为的失败

所以,我的答案是,你的不能阻止共享如果用户愿意把一些努力,以避免它。

您只需保持诚实的人诚实通过应用一些技术,如 Spikolynn Lusid 在他们的答案解释。

我建议一个表保存到其中每个用户具有访问权限的文件:

UserID int
FileID varchar

然后为您的文件表:

FileID    UniqueIdentifier
FileType  char(4)  <- so you know which extension to use.
etc...

在硬盘驱动器,命名文件中写到FileID(唯一标识符)和激活FileType(的扩展名,例如,.JPG)。在权限表的FILEID将保存唯一标识符中的其他表中生成。

您可以通过URL相对安全地知道用户将无法猜测任何其他文件的名称传递,例如:

更新:这是,顺便说一句,的比写简单的一个HttpHandler或处理文件的权限。然而,尽管有人猜测另一个文件名的机会是无穷它不是无懈可击的安全性是一个用户可以给另一个访问文件。

brownpaperpackage.aspx?ID = {GUID}

在media.aspx的Load事件,则验证所述用户被认证,然后验证用户具有观看媒体的权利,并且如果他们这样做,然后加载媒体作为流并将其馈送到该网页的响应如 Spikolynn 证实。

为什么这样说?其简单的代码,你会得到的ASP.NET和IIS的身份验证服务的所有好处,从中你可以找到请求媒体用户。它的琐碎该用户访问列表地图的媒体对象。并且页面有要求的对象就在这里。你还隐藏了媒体的名称,所以你不能告诉什么从URL回事。

你如何保持人直接访问您的媒体?你的媒体文件不能存储在IIS虚拟目录。如果是这样,有一种可能性,即它们可以直接下载。您可以将它们存储在数据库中的字节数组(BLOB)或它们在磁盘上存储网络虚拟目录之外。用户必须通过ASP.NET访问文件

您如何跟踪哪些用户可以访问哪些媒体?您跟踪用户的thorugh 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" />
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top