asp.net 仅供授权用户使用的 MVC 安全根文件夹

asp.net MVC secure root folder only for authorized users

我有这个小型外联网服务,用户可以在其中登录、获取各种信息并下载一些文件。

是否可以保护 MVC asp.net 项目中的根文件夹?我有一个项目,用户必须在使用任何 material 之前登录。如果我为每个 pdf、jpg 等文件使用例如“/material”文件夹,其他未经授权的用户也可以看到这些文件。

例如,如果每个人键入 www.example.com/material/pdf-file.pdf,他们都可以看到这个文件,所以我希望只有授权/登录用户才能看到这个文件。这可能吗?

可以做到这一点,但是有很多方法可以做到这一点。

一个简化的场景可以是:

  • Disable directory listing on IIS
  • 创建自定义 "download wrapper" 控制器+操作以提供这些文件。
  • 然后无论您在哪里创建操作链接,都使用 HtmlHelper 生成它们,这会将客户端重定向到 "wrapper" 控制器操作。您可以在参数中传递文件名。
  • 在 "wrapper" 控制器上,您可以使用 [Authorize] attribute or better yet, without using such attributes everywhere you could use FluentSecurity 来处理授权。

创建 "wrapper" 控制器后,用于获取文件的 URL 可能如下所示:

www.example.com/download/file/pdf-file.pdf

此示例 URL 假设 controller 名称为 'download' 并且 action 名称为 'file' .

我成功了。这是我的做法。

首先我将这一行添加到 Web.config 文件中:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">

这允许在 url 中使用 .pdf、.png 等中的点字符。

我为控制器添加了 RouteConfig.cs 新路由。

routes.MapRoute(
            name: "Material",
            url: "Material/Download/{file}",
            defaults: new { controller = "Material", action = "Download", file = UrlParameter.Optional }
        );

我创建了一个新控制器"Material"。

// GET: Material
    [Authorize]
    public ActionResult Download(string file)
    {
        string path = Server.MapPath(String.Format("~/App_Data/Material/{0}", file));

        if(System.IO.File.Exists(path))
        {
            string mime = MimeMapping.GetMimeMapping(path);

            return File(path, mime);
        }

        return HttpNotFound();
    }   

并且还转移了 material 文件夹到 app_data。

这似乎工作得很好。只有授权用户才能访问 material 文件夹。