如何保护仅由特定用户下载的链接?

时间:2012-04-02 08:44:42

标签: c# asp.net security iis authorization

我有以下情况,我想问一下什么是最好的解决方案?

我有一个特定的文件我希望特定用户(根据某些权限)下载此文件。

所以我只为授权用户显示此文件,但如果有人(未经授权)识别文件链接(知道链接url)并下载它,该怎么办?

如何仅允许authorized users下载此文件。

4 个答案:

答案 0 :(得分:4)

将文件放入一个不由Web服务器提供服务的目录中,并实现“虚拟URL”的处理程序,后者又检查权限等。 - 可能的方法是ASHX处理程序(参见{{3}) }用于示例代码,here用于MSDN参考)。

答案 1 :(得分:4)

我的回答是: 不要使用直接链接!

创建一个Download.aspx并将下载链接发布到Download.aspx?params

params应加密/散列,包含要下载的文件路径+名称和session_id。

在Download.aspx上验证session_id在浏览器上是否有效且有效。

这应该允许您仅允许下载到正确的人:

如果您还在params上添加了user_id或user_type,您可以在onLoad of Download.aspx上拒绝/允许下载

答案 2 :(得分:1)

最好的方法是添加httphandlers并检查所请求的文件是否具有特殊权限,这是我所说的例子:

        using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;

public class MyHTTPHandler : IHttpHandler, IRequiresSessionState
{

string myFile;
public bool IsReusable {
    get { return true; }
}

public void ProcessRequest(System.Web.HttpContext context)
{
    myFile = context.Request.Path;
    if (myFile.ToLower().Contains("members private files") || myFile.ToLower().Contains("members%20private%20files")) {
        if (System.Web.HttpContext.Current.Session["Login"] == null) {
            context.Response.Redirect("~/NotAuthorized.aspx");
        } else {
            if (myFile.ToLower().Contains("privatefiles")) {
                StartDownload(context, myFile);
            } else {
                if (IsMemberAuthoraizedToDownloadFile(context)) {
                    StartDownload(context, myFile);
                } else {
                    context.Response.Redirect("~/NotAuthorized.aspx");
                }
            }
        }
    } else {
        StartDownload(context, myFile);
    }
}

private void StartDownload(HttpContext context, string downloadFile)
{
    context.Response.Buffer = true;
    context.Response.Clear();
    context.Response.AddHeader("content-disposition", "attachment; filename=" + downloadFile);
    context.Response.ContentType = "application/pdf";
    context.Response.WriteFile(downloadFile);
}

// just my own function to check if user is valid

private bool IsMemberAuthoraizedToDownloadFile(HttpContext context)
{
    GroupMembersControl MyGroupMemberc = new GroupMembersControl();
    System.Collections.Generic.List<GroupMembers> MemberGroupsL = MyGroupMemberc.GetMemberGroups(System.Web.HttpContext.Current.Session["Login"]);
    MemberGroupControl MyGroupC = new MemberGroupControl();
    MemberGroup MyGroup = default(MemberGroup);
    foreach (GroupMembers groupmember in MemberGroupsL) {
        MyGroup = MyGroupC.GetMemberGroup(groupmember.GroupID);
        if (myFile.ToLower().Contains(MyGroup.Name.ToLower)) {
            return true;
        }
    }
    return false;
}
    }

答案 3 :(得分:1)

以下链接提供了有关iis和asp.net中授权规则的详细信息,这似乎与您的问题相关。

首先,您要确保ASP.NET处理指定文件类型的请求。您可以在IIS中配置它(请参阅下面的链接)。

其次,您将需要更新您的web.config以拒绝匿名用户访问您的网址,前提是您正在使用rolemanager:

 <roleManager defaultProvider="SqlProvider" enabled="true" cacheRolesInCookie="false"     
   cookieName=".ASPROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false"  
   cookieSlidingExpiration="true" cookieProtection="All">
  <providers>
    <add name="SqlProvider" type="System.Web.Security.SqlRoleProvider" 
        connectionStringName="membership" applicationName="yourApplication"/>
  </providers>
</roleManager>



<location path="path/file.extension">
      <system.web>
      <authorization>
         <deny users="?"/>
       </authorization>
     </system.web>
   </location>

IIS 6 ignores Web.config authorization settings