目錄 一、執行個體示範 二、AuthorizationFilterAttribute 三、AuthorizeAttribute 四、PageBase
我們先來作一個簡單的執行個體示範。如下所示的EntLib安全子產品的配置,如果讀者對此不了解也沒有關系,在這裡我們隻需要關注定義其中的一個授權規則(Authorization Rule):“I:Foo OR R:Admin”。這是一個邏輯表達式,字首I:和R:分别表示使用者名(Identity)和角色(Role),整個表達式表示的授權邏輯是:“帳号為Foo的使用者和所有具有Admin角色的使用者”有權限方法與此表達式關聯的操作或者資源。配置還定義了該授權規則的名稱“FooOrAdmin”。
我們添加一個需要授權的Web頁面(Default.aspx),并且使用上面定義的表達式來作為該頁面的授權規則,我們通過自定義的AuthorizeAttribute特性實作兩者之間的關聯(該特性構造函數中指定的字元串正是配置的授權規則名稱)。除此之外,Web頁面對應的類型繼承自我們自定義的基類PageBase。
我們随後添加一個登入頁面,具體的實作就不再這裡一一介紹了。為了模拟不同的登入使用者具有不同的權限,我們通過注冊HttpApplication的AuthenticateRequest事件來對目前Principal進行定制。具體的定義如下所示:如果使用者名為Bar,我們讓目前的Principal具有Admin角色,對于其他帳号的登入使用者,角色清單為空。
由于頁面Default.aspx與配置名稱為FooOrAdmin的授權規則進行了關聯,根絕授權規則表達式定義和針對不同使用者的角色清單,意味着當我們以賬戶Foo和Bar登入後才能通路該頁面,“自動化授權”可以通過下圖得到證明:目前使用者為Foo和Bar時,頁面得以正常顯示;而當我們以Baz的身份登入後,顯示“Access
denied…”。
這裡我吸取了ASP.NET
MVC基于AuthorizationFilter的授權方式,不同的是AuthorizationFilter在ASP.NET
MVC中以特性的方式應用到Controller類型和Action方法上,這裡我們則将它應用到Web頁面對應的類上。AuthorizationFilterAttribute作為授權篩選器特性的基類定義如下,由于多個特性可以同時應用到同一個類型上,它們的執行順序通過屬性Order來控制。具體的授權判斷以及對非授權請求的處理定義在方法OnAuthorization方法上。
OnAuthorization方法傳回值代表的是真否授權的判斷,它具有一個類型為AuthorizationContext參數。AuthorizationContext是對HttpContext對象的封裝,屬性UnAuthorizedRequestHandled
表示是否完成了針對非授權請求的處理。如果多個AuthorizationFilterAttribute應用到同一個類型上,如果前面執行的AuthorizationFilterAttribute将傳入的AuthorizationContext的這個屬性設定為True,後續的将不在執行。
基于EntLib的授權通過AuthorizeAttribute來實作。如下面的代碼片斷所示,AuthorizeAttribute
直接繼承自AuthorizationFilterAttribute,代表授權規則配置名稱的屬性AuthorizationRule
在構造函數中被初始化。在實作的OnAuthorization我們按照Entlib授權架構的程式設計模式判斷目前Principal是否具有針對指定授權規則的權限,對于非授權請求我們直接調用HandleUnauthorizedRequest方法進行處理。具體的處理邏輯很簡單:直接相應一段文字“Access
denied…”(正是上面截圖中顯示的文字)。出于可擴充的考慮,我們将此方法定義成受保護的虛方法。
我們知道針對一個ASP.NET
資源的請求最後大都通過一個對應的HttpHandler來處理,這個授權解決方案的基本思路就是通過自定義HttpHandler實作自動化授權檢驗。Page類型是我們最為熟悉的HttpHandler,為此我們定義了如下一個繼承自它的類型PageBase。如下面的代碼片斷所示,在重寫的ProcessRequest方法中實作了對應用在目前類型上的AuthorizationFilterAttribute特性的解析和執行,進而提供了對授權的實作。
作者:蔣金楠
微信公衆賬号:大内老A
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識别二維碼)關注個人公衆号(原來公衆帳号蔣金楠的自媒體将會停用)。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
<a href="http://www.cnblogs.com/artech/archive/2012/10/23/rule-based-authorization.html" target="_blank">原文連結</a>