程序代碼下載:點此下載git
ASP.NET Identity是微軟所貢獻的開源項目,用來提供ASP.NET的驗證、受權機制。而在ASP.NET Identity的功能模塊中:是採用Claims-Based驗證來提供驗證機制、而且實做Role-Based受權來提供受權機制。開發人員在系統內套用ASP.NET Identity後,就能夠像下列範例同樣定義用戶屬於哪一個角色、哪一個角色可使用那些功能,後續用戶經過驗證以後,就能夠依照角色受權來使用系統功能。github
ASP.NET Identity受權機制,能夠在系統運行中動態變動用戶所屬的角色,可是卻不能動態變動角色可使用的功能。這是由於在ASP.NET Identity裏,使用者屬於哪一個角色的設定儲存於數據庫能夠動態變動,而角色可使用那些功能的設定則是定義在程序代碼沒有辦法動態變動。雖然這樣的受權機制已經能夠符合大部分的開發需求,但在須要動態變動角色使用那些功能的開發項目中,開發人員就沒有機會使用到ASP.NET Identity豐富的驗證受權機制。數據庫
領域模型瀏覽器
角色可使用那些功能工具
public class HomeController : Controller { [Authorize(Roles = "Admin")] public ActionResult Contact() { ... } [Authorize(Roles = "Guest")] public ActionResult Contact() { ... } }
使用者屬於哪一個角色設計
本篇文章介紹一個基於ASP.NET Identity開發設計的驗證受權模塊:CLK.AspNet.Identity。這個驗證受權模塊提供以角色爲基礎的訪問控制(Role-based access control, RBAC),將系統受權拆解爲User(使用者)、Role(角色)、Permission(權限)。開發人員在系統內套用CLK.AspNet.Identity後,就能夠像下列範例同樣定義用戶屬於哪一個角色、哪一個角色擁有那些權限、權限可使用哪些功能,後續用戶經過驗證以後,就能夠依照角色權限來使用系統功能。code
CLK.AspNet.Identity受權機制,除了能夠繼續使用繼承自ASP.NET Identity的Claims-Based驗證機制以外,也能夠在系統運行中動態變動儲存於數據庫的受權設定:使用者所屬的角色、角色擁有的權限,讓系統的受權設定更加靈活多變,用以知足更多的用戶需求。繼承
領域模型ip
權限可使用哪些功能開發
public class HomeController : Controller { [RBACAuthorize(Permission = "AboutAccess")] public ActionResult Contact() { ... } [RBACAuthorize(Permission = "ContactAccess")] public ActionResult Contact() { ... } }
權限屬於哪一個角色
使用者屬於哪一個角色
首先開啓Visual Studio創建一個「徹底空白」的ASP.NET Web 應用程序。
接着開啓NuGet管理工具,搜尋並安裝:「CLK.AspNet.Identity.Mvc Template」
安裝須要花費一些時間,安裝完畢後便可看到必要檔案都已加入至項目。
安裝好CLK.AspNet.Identity以後,按下Visual Studio的執行按鈕,就能夠在瀏覽器上看到預設的首頁內容。
回到Visual Studio開啓項目中的HomeController,能夠看到預設權限可使用哪些功能的程序代碼。
public class HomeController : Controller { [RBACAuthorize(Permission = "AboutAccess")] public ActionResult Contact() { ... } [RBACAuthorize(Permission = "ContactAccess")] public ActionResult Contact() { ... } }
使用預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:About,由於guest@example.com屬於Guest羣組、而Guest羣組沒有AboutAccess權限,因此會收到403拒絕訪問的頁面內容。
使用預設的管理帳號登入(ID:admin@example.com, PW:admin),點擊頁面選單按鈕:PermissionsAdmin進入權限管理頁面,編輯AboutAccess權限,讓Guest羣組擁有AboutAccess權限。
更換回預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:About,由於如今Guest羣組擁有AboutAccess權限,因此能夠瀏覽About頁面內容。
使用預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:Contact,由於guest@example.com屬於Guest羣組、而Guest羣組沒有ContactAccess權限,因此會收到403拒絕訪問的頁面內容。
使用預設的管理帳號登入(ID:admin@example.com, PW:admin),點擊頁面選單按鈕:UsersAdmin進入使用者管理頁面,編輯guest@example.com使用者,讓guest@example.com使用者加入到Admin羣組。
更換回預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:Contact,由於如今guest@example.com屬於Admin羣組,而Admin羣組擁有ContactAccess權限,因此能夠瀏覽Contact頁面內容。
回到Visual Studio編輯新功能,首先在HomeController增長一個新功能「News」、設定NewsAccess權限可使用這個功能,而且在Viwes裏面加上對應的變動。
public class HomeController : Controller { [RBACAuthorize(Permission = "NewsAccess")] public ActionResult News() { ViewBag.Message = "Your news page."; return View(); } }
按下Visual Studio的執行按鈕,能夠在瀏覽器上看到預設的首頁內容,而且內容中多了一個名稱爲News的頁面選單按鈕。
使用預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:News,這時由於系統裏沒有設定NewsAccess權限,因此會收到PermissionName not found.的錯誤訊息頁面。
使用預設的管理帳號登入(ID:admin@example.com, PW:admin),點擊頁面選單按鈕:PermissionsAdmin進入權限管理頁面,新增NewsAccess權限,而且讓Guest羣組擁有NewsAccess權限。
更換回預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:News,由於如今Guest羣組擁有NewsAccess權限,因此能夠瀏覽News頁面內容。
程序代碼下載:點此下載