Asp.net mvc 4 MVC 4将目录中的文件映射到控制器操作,以确保对文档的授权访问

Asp.net mvc 4 MVC 4将目录中的文件映射到控制器操作,以确保对文档的授权访问,asp.net-mvc-4,controller,authorization,directory,Asp.net Mvc 4,Controller,Authorization,Directory,如果我的网站目录中有文件: ~/documents/file1.pdf 如何强制对以下url的请求通过控制器: www.mydomain.com/documents/file1.pdf 控制器将看起来像 [Authorize] public DocumentsController : Controller { public FileResult Index(string fileName) { //Check user has permission to

如果我的网站目录中有文件:

~/documents/file1.pdf

如何强制对以下url的请求通过控制器:

www.mydomain.com/documents/file1.pdf

控制器将看起来像

[Authorize]
public DocumentsController : Controller
{
     public FileResult Index(string fileName)
     {
          //Check user has permission to view file



          return File(...);
     }
}

我将文档目录放在App_数据文件夹中,这样公众就无法访问它,并使用数据库中的文档ID检索相关信息,例如

/文件/21


我认为我更喜欢这种方法,因为它将路径和文档标题的标识抽象得更为彻底,因为控制器路径可以是任何东西,并且不必映射到物理目录路径。

这并不困难,只要您可以做出一些假设

首先,按照您的建议创建您的行动方法:

[Authorize]
public DocumentsController : Controller
{
     public FileResult Index(string fileName)
     {
          //Check user has permission to view file

          return File(...);
     }
}
接下来,创建一条管线:

routes.MapRoute(
    name: "Documents",
    url: "documents/{fileName}",
    defaults: new { controller = "Documents", action = "Index" }
您可能需要通过在web.config中添加以下内容来放宽url验证要求(这仅适用于IIS7-8,但据我所知,IIS6可能需要http模块):


不幸的是,您无法将mvc路由映射到文件名(没有像.pdf这样的扩展名)
<httpRuntime relaxedUrlToFileSystemMapping="true" />