2010-01-26 132 views
7

在CodePlex上瀏覽MVC部分後,我注意到MVC中的[Authorize]屬性在授權失敗時返回HttpUnauthorizedResult()(codeplex AuthorizeAttribute class)。MVC授權屬性+ HttpUnauthorizedResult + FormsAuthentication

在CodePlex中的HttpUnauthorizedResult()的源代碼是(我不允許輸入另一個URL,因爲我的代表不夠高,但用22929#266476替換上面的URL上的數字):

// 401 is the HTTP status code for unauthorized access - setting this 
// will cause the active authentication module to execute its default 
// unauthorized handler 
context.HttpContext.Response.StatusCode = 401; 

特別是,註釋描述了認證模塊的默認未授權處理程序。

我似乎無法找到有關此默認未經授權的處理程序的任何信息。特別是,我沒有使用FormsAuthentication,當授權失敗時,我得到一個醜陋的IIS 401錯誤頁面。

有沒有人知道這個默認的未授權處理程序,特別是FormsAuthentication如何掛鉤以覆蓋它?

我正在爲我的足球隊寫一個非常簡單的應用程序,他們確認或否認他們是否可以參加特定的比賽。如果我在Web.config中啓用FormsAuthentication,重定向的工作方式,但我沒有使用FormsAuthentication,我想知道是否有解決方法。

+0

您使用的是什麼樣的身份驗證? – Zote 2010-01-26 16:09:01

+0

你想授權嗎?關於認證的最終結果是什麼? – 2010-01-26 16:10:51

+1

我寫了我自己的小認證模塊,它分配了一個身份和角色。 [授權]需要檢查用戶是否可以訪問該頁面以確認他們可以在特定的比賽中進行比賽。如果他們不被允許根據角色進行遊戲,那麼我們不會給出一個非常無用的401錯誤,而是要給他們一些關於他們爲什麼不能玩的有用信息。重寫這個401似乎是合乎邏輯的方法,但我很驚訝於這個默認的未授權處理程序的文檔很少。 – Anthony 2010-01-26 16:23:23

回答

11

如果您有Reflector,請查看System.Web.Security.FormsAuthenticationModule.Init()。此方法掛接Application_EndRequest並調用OnLeave()。 OnLeave()方法檢查響應代碼是否爲HTTP 401.如果是,則模塊執行重定向而不是將401冒泡到客戶端。 (這個邏輯就是評論所說的'默認未授權處理程序')。在你的特定情況下,ASP.NET讓401冒泡到客戶端,但IIS攔截它並顯示一個醜陋的錯誤頁面。

你可以在Global.asax中做一些非常類似的事情。創建一個方法Application_EndRequest;此方法將在您的應用程序提供服務的每個請求結束時調用。從這裏,你可以做任何你想做的事。如果您想檢查回覆是否爲401並將其重定向到其他頁面,則可以從此處進行。

+0

謝謝Levi - 我沒有真正使用過Reflector,但會看看它。我應該懷疑它可能是掛鉤EndRequest事件的東西,雖然它看起來很不方便做重定向。 我想另一種選擇是創建一個自定義的授權類,當授權失敗時調用另一個方法給HttpUnauthorizedResult(),它可能返回一個不同的ActionResult(可能是授權失敗信息頁)? – Anthony 2010-01-26 18:23:51

+1

這將工作。如果你走這條路線,子類AuthorizeAttribute並重寫HandleUnauthorizedRequest()方法。將EndRequest掛鉤在這上面的唯一真正好處是掛鉤EndRequest允許您從應用的其他部分捕獲授權失敗,而不僅僅是[Authorize]。 – Levi 2010-01-26 20:56:59

+0

我認爲掛鉤EndRequest聽起來像是更好地利用時間,因爲像你說的那樣,可以覆蓋更多的應用程序。我還閱讀了有關輸出緩存的AuthorizeAttribute和潛在問題 - 甚至在codeplex源代碼中對它進行了評論,但實際上如果我有時間的話,我猜這兩種授權都不會受到傷害。儘管我將從EndRequest開始。謝謝你的幫助Levi。 – Anthony 2010-01-27 11:31:36