2010-09-16 74 views
0

我正在使用asp.net成員資格提供程序進行用戶身份驗證。我有另一個表與其他用戶詳細信息鏈接到我的aspnet_users表。如何擴展ASP.NET MVC AuthorizeAttribute

當用戶登錄到我的站點時,我將我稱之爲「UserProfile」的內容放入會話變量中,並且需要在我的控制器(我的登錄頁面後面的所有控制器)中檢查每次調用時是否存在此Session變量。 。

所以我的問題是這樣的:

我已經寫了繼承其調用默認base.AuthorizeCore()方法,並檢查我的會話對象的存在AuthorizeAttribute(會話[「用戶配置一個ActionFilter 「]),我還創建了一個基礎控制器,它保存着我的UserProfile類型的對象,所有適當的控制器類都從它繼承,因此它們可以訪問我的UserProfile。 如何在我的ActionFilter中使用我的方法將此UserProfile屬性設置爲控制器中的Session變量?

回答

0

爲什麼你不能簡單地在基本控制器中做到這一點?這似乎是填補財產的正確地點。在您的自定義授權屬性中執行操作會創建一個不必要的依賴項,並導致更多的複雜性。我所說的是檢查會話中是否存在密鑰,而相關的,與填充屬性不同。事實上,如果您最終決定在會話中僅存儲數據庫密鑰,並且每次都從數據庫中檢索更復雜的配置文件對象,則它可能會非常不同。還要注意,授權屬性稍後可以應用於一個方法而不是一個類 - 此時,您可能會多次執行該屬性的填充。

但是,如果您認爲必須傳遞給屬性的OnAuthorization方法的AuthorizationContext包含對控制器的引用。你可以將它作爲基礎控制器(使用as語法並檢查是否爲空),然後直接訪問屬性(如果是公共的)或通過反射(如果不是)。

0

與tvanfosson相同,不要將屬性添加到您的控制器庫,這取決於所應用的ActionFilter。

另一種方法是將代碼移動到一個單獨的類,該類檢索/檢查對該屬性的訪問。 ActionFilter和控制器基礎都使用該類來檢索值。 依賴關係是明確的,這使得它更容易理解另一個開發人員