2

我在我的 ASP MVC 4 应用程序中放置了一个名为“Protected”的子目录,并在该目录中放置了一个简单的 test.html 文件,但我终生无法弄清楚如何让我的自定义全局 AuthorizeAttribute 类在何时触发我在浏览器中查看 test.html 文件。

我在集成模式下使用 IIS Express,所以我认为这会起作用。我什至在集成模式下尝试了 IIS 7,但它仍然对我不起作用。

但也许我做的事情都错了。也许是我的一些误解。

基本上,我需要以编程方式授权对该文件夹中静态文件的请求。还有另一种方法吗?

AD 于 2013 年 4 月 9 日上午 10:07:25 更新:Zidad 在下面的回答让事情朝着正确的方向发展,但我现在无法配置路线。这就是我所拥有的,但该文件仍被直接提供,而不是点击 Home/File 操作。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute("NotFound", "protected/test.html", new { controller = "Home", action = "File" });

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });

由 AD 于 2013 年 4 月 9 日上午 10:20:54 更新:Ohhhhhhhhhhhhhhhhhhh,现在我明白了!绝对是我的误解。我想我还有一些东西要学。:)

4

1 回答 1

3

首先确保添加到您的 web.config 以确保 IIS 在提供静态文件时不会绕过 .NET:

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

那么您应该能够将 web.config 文件添加到受保护的文件夹中,其中包含:

<authorization>
  <deny users="?" />
</authorization>

如果您确实想使用“AuthorizeAttribute”,则可以将路由映射到返回受保护文件夹中文件的控制器操作,并将该属性应用于该方法,如下所示:

ASP.NET MVC 控制器可以返回图像吗?

更新:要使受保护文件的 URL 保持不变,您可以像这样配置路由:

routes.MapRoute(
                name: "ProtectedFile", 
                url: "protected/{name}", 
                defaults: new { controller = "Home", action = "File", name = "index.html" });

然后像这样写下你的动作:

public ActionResult File(string name){
// return file
}

看哪:通过 .NET 提供所有静态文件会降低性能,并且此操作没有考虑 IIS 在提供静态文件时会自动为您执行的所有 HTTP 最佳实践,例如静态内容压缩,返回“未修改 (304 )" HTTP 状态,添加 ETAG 等。

于 2013-04-09T13:53:09.780 回答