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 文件夹。
我有这个小型外联网服务,用户可以在其中登录、获取各种信息并下载一些文件。
是否可以保护 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 文件夹。