2013-04-09 96 views
2

我把一個子目錄中所謂的「保護」和我放棄了在該目錄中一個簡單的test.html文件放在我的ASP MVC 4應用程序,但我不能爲我的生活弄清楚如何當我在瀏覽器中查看test.html文件時,觸發我的自定義全局AuthorizeAttribute類。ASP MVC 4不處理靜態文件

我使用的是IIS Express在集成模式,所以我認爲這是可行的。我甚至在集成模式下嘗試過IIS 7,但它仍然不適用於我。

但是,也許我會的事情都錯了。也許這是我的一些誤解。

基本上,我需要以編程方式批准該文件夾內請求靜態文件。還有另一種方法可以做到嗎?

更新爲2013年4月9日上午10時07分25秒的AD的:下面Zidad的回答得到的東西在正確的方向前進,但我遇到了麻煩,現在配置的路由。這是我得到的,但該文件仍然直接提供,而不是點擊家庭/文件操作。

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 }); 

更新爲2013年4月9日上午十點二十分54秒由AD:Ohhhhhhhhhhhhhhhhhhh,現在我明白了!對我而言絕對是一個誤解。猜猜我還有一些事情要學習。 :)

回答

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?

UPDATE:保持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將執行automati的所有HTTP最佳實踐凱莉爲你服務時的靜態文件,如靜態內容壓縮,返回「不修改(304)」 HTTP狀態,增加的ETag等

+0

更新,現在的問題反映的情況。 – 2013-04-09 14:05:59