限制对共享文件夹的访问

时间:2012-12-31 23:39:58

标签: asp.net

我有一个名为“reports”的共享文件夹。在这个文件夹中有pdf文件。

fd6.pdf fd3.pdf

用户“fd3”通过身份验证后,用户可以通过url访问此文件夹中的任何pdf。有一种简单的方法可以防止这种情况吗?

2 个答案:

答案 0 :(得分:1)

有几种方法可以实现这一目标。我假设您的身份验证是Forms Auth或其他此类自定义应用程序身份验证,而不是通过模拟进行管理(如果您使用的是Windows身份验证/模拟,那么您可以直接使用文件上的ACL解决此问题。)

  1. 您需要配置IIS,以便它将调用PDF文件的托管模块。如果您使用的是IIS7 +,这很简单,因为您可以使用集成管道。如果您使用的是IIS6,或者必须使用经典管道,那么您需要使用wildcard mapping或至少使用PDF扩展,以允许托管代码针对您的静态内容执行。
  2. 创建单独的IHttpModule,或添加到Web应用程序的Global.asax.cs。您要做的是附加到应用程序的AuthorizeRequest事件。
  3. 检查路径和文件名,看它是否符合您的规则。如果失败,请将Response.StatusCode设置为403(HTTP:Forbidden)。
  4. Global.asax.cs示例:

    protected void Application_AuthorizationRequest(object sender, EventArgs e)
    {
        var application = (HttpApplication)sender;
        var context = application.Context;
    
        if (context.User.Identity.IsAuthenticated
            && Path.GetFileName(Path.GetDirectoryName(context.Request.Path)).Equals("reports", StringComparison.OrdinalIgnoreCase)
            && Path.GetExtension(context.Request.Path).EndsWith("pdf", StringComparison.OrdinalIgnoreCase))
        {
            var fileName = Path.GetFileNameWithoutExtension(context.Request.Path);
    
            if (!context.User.Identity.Name.Equals(fileName, StringComparison.InvariantCultureIgnoreCase))
            {
                context.Response.StatusCode = 403;
                context.Response.StatusDescription = "You are forbidden to view this file.";
            }
        }
    }
    

答案 1 :(得分:1)

我喜欢使用web.config中的local属性保护文件

 <location path="pdfs/files">
<system.web>
  <authorization>
    <allow roles="superuser,admin,VolunteerCoordinator,presenter,ReferralMaker"/>
    <deny users="*"/>
  </authorization>
</system.web>

   

然后确保定义了您的角色以阻止访问您正在保护的目录