3

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

fd6.pdf fd3.pdf

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

4

2 回答 2

1

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

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

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.";
        }
    }
}
于 2013-01-01T00:26:02.133 回答
1

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

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

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

于 2013-01-01T06:58:46.717 回答