2011-07-28 43 views
52

使用ASP.NET MVC我正在創建一個自定義的Authorize屬性來照顧一些自定義的授權邏輯。我看了很多例子,它非常簡單,但我的問題是哪個方法最好覆蓋AuthorizeCore或OnAuthorization?我看到很多例子都凌駕於其中。有區別嗎?擴展AuthorizeAttribute覆蓋AuthorizeCore或OnAuthorization

+1

結帳在MVC4,http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/e0115a823029#src%2fSystem.Web.Mvc%2fAuthorizeAttribute.cs – user1736525

回答

71

的線索是在返回類型:

AuthorizeCore返回一個布爾值 - 這是決策代碼。這應該是僅限於查看用戶的身份,並測試他們在等,等,這些角色基本上應該回答的問題:

Do I want this user to proceed?

它不應該執行「就在身邊」的任何其他活動。

OnAuthorize返回void - 這是您在此處需要發生的任何功能的位置。例如寫入日誌,在會話中存儲一些數據等。

+1

的源代碼謝謝你的信息 –

+14

可惜AuthorizeCore不包含我需要的AuthorizationContext(用於訪問RouteData並根據它進行決策),因此我看到的唯一方法是使用OnAuthorize。 – gw0

+4

爲什麼地球上不是'AuthorizationContext'傳遞給'AuthorizeCore'?這似乎是一個主要缺陷。 – Jez

15

無論用戶是第一次被授權還是在AuthorizeCore中使用緩存授權,您都應該放置任何必須運行的代碼。

如果你看看源代碼,你可以看到AuthorizeCoreOnAuthorizeOnCacheAuthorization所調用。這允許授權被緩存,但仍然允許某些操作並做出有關授權的實際決策。

如果您需要AuthorizationContext中的某些內容,則可以創建一個屬性來保存信息,然後在AuthorizeCore方法中訪問該屬性。

+0

我希望我可以突出顯示答案的最後一句。你真的應該大膽。在接受的答案中提到@ gw0的評論時,真正不幸的是,對錯誤原因使用錯誤覆蓋的建議已被投票。 –

+3

AuthorizeAttribute(MSDN)的文檔清楚地指出(在線程安全下) _「任何實例成員不保證是線程安全的。」因此,我認爲持有屬性中的信息不是一種選擇。 – bvgheluwe

+0

@BartVG - 我不知道我跟着。線程安全與這個討論有什麼關係?所有這些文本的含義是,如果將以多線程方式使用對象,則必須同步對象的訪問權限。 –