我在我的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,现在我明白了!绝对是我的误解。猜猜我还有一些东西需要学习。 :)
答案 0 :(得分:3)
首先确保添加到web.config以确保IIS在提供静态文件时不会绕过.NET:
<system.webServer>
...
<modules runAllManagedModulesForAllRequests="true" />
...
</system.webServer>
然后您应该能够将web.config文件添加到包含以下内容的受保护文件夹中
<authorization>
<deny users="?" />
</authorization>
如果您确实想使用'AuthorizeAttribute',您可以将路由映射到控制器操作,返回受保护文件夹中的文件,并将该属性应用于该方法,如下所示:
Can an ASP.NET MVC controller return an Image?
更新:要保护受保护文件的URL,您可以像这样配置路由:
routes.MapRoute(
name: "ProtectedFile",
url: "protected/{name}",
defaults: new { controller = "Home", action = "File", name = "index.html" });
然后写下你的动作:
public ActionResult File(string name){
// return file
}
Behold :通过.NET提供所有静态文件会降低性能,此操作不会考虑IIS在提供静态文件时会自动为您执行的所有HTTP最佳做法,例如静态内容压缩,返回“未修改(304)”HTTP状态,添加ETAG等