asp.net MVC安全根文件夹仅适用于授权用户

时间:2015-11-13 13:13:30

标签: c# asp.net asp.net-mvc security authorization

我正在使用这个小的外联网服务,用户可以登录,获取各种信息并下载少量文件。

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

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

2 个答案:

答案 0 :(得分:2)

我设法让它发挥作用。我就是这样做的。

第一个我将此行添加到Web.config文件中:

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

这允许。urf中的.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();
    }   

并且还在app_data中传输了材料文件夹。

这似乎很好用。只有授权用户才能访问材料文件夹。

答案 1 :(得分:0)

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

简化的方案可能是:

  • Disable directory listing on IIS
  • 创建自定义&#34;下载包装&#34;控制器+动作用于提供这些文件。
  • 然后,无论您在何处创建Action链接,都可以使用HtmlHelper生成它们,这会将客户端重定向到&#34;包装器&#34;控制器动作。您可以在参数中传递文件名。
  • 关于&#34;包装&#34;控制器你可以使用[Authorize]属性或更好,但不使用这些属性,你可以使用FluentSecurity来处理授权。

创建&#34;包装后&#34;控制器URL获取文件可能如下所示:

  

www.example.com/ 下载 / 文件 /pdf-file.pdf

此示例URL假定控制器名称为&#39; download&#39;和操作名称是&#39;文件&#39;。