[ASP.NET MVC] 使用CLK.AspNet.Identity提供以角色為基礎的訪問控制(RBAC)
程序代碼下載
程序代碼下載:點此下載
前言
ASP.NET Identity是微軟所貢獻的開源項目,用來提供ASP.NET的驗證、授權機制。而在ASP.NET Identity的功能模塊中:是采用Claims-Based驗證來提供驗證機制、並且實作Role-Based授權來提供授權機制。開發人員在系統內套用ASP.NET Identity后,就可以像下列范例一樣定義用戶屬於哪個角色、哪個角色可以使用那些功能,后續用戶通過驗證之后,就可以依照角色授權來使用系統功能。
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后,就可以像下列范例一樣定義用戶屬於哪個角色、哪個角色擁有那些權限、權限可以使用哪些功能,后續用戶通過驗證之后,就可以依照角色權限來使用系統功能。
CLK.AspNet.Identity授權機制,除了可以繼續使用繼承自ASP.NET Identity的Claims-Based驗證機制之外,也可以在系統運行中動態變更儲存於數據庫的授權設定:使用者所屬的角色、角色擁有的權限,讓系統的授權設定更加靈活多變,用以滿足更多的用戶需求。
-
領域模型
-
權限可以使用哪些功能
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頁面內容。
程序代碼下載
程序代碼下載:點此下載