[ASP.NET MVC] 使用CLK.AspNet.Identity提供以角色為基礎的存取控制(RBAC)

摘要:[ASP.NET MVC] 使用CLK.AspNet.Identity提供以角色為基礎的存取控制(RBAC)

[ASP.NET MVC] 使用CLK.AspNet.Identity提供以角色為基礎的存取控制(RBAC)

CLK.AspNet.Identity

CLK.AspNet.Identity是一個基於ASP.NET Identity擴展設計的驗證授權模組,這個模組提供以角色為基礎的存取控制(Role-based access control, RBAC),將系統授權拆解為User(使用者)、Role(角色)、Permission(權限)。讓開發人員可以在系統內,定義使用者屬於哪個角色、哪個角色擁有那些權限、權限可以使用哪些功能。後續使用者通過驗證之後,就可以依照角色權限來使用系統功能。

問題情景

ASP.NET Identity是微軟所貢獻的開源專案,用來提供ASP.NET的驗證、授權機制。而在ASP.NET Identity的功能模組中:是採用Claims-Based驗證來提供驗證機制、並且實作Role-Based授權來提供授權機制。開發人員在系統內套用ASP.NET Identity後,就可以像下列範例一樣定義使用者屬於哪個角色、哪個角色可以使用那些功能,後續使用者通過驗證之後,就可以依照角色授權來使用系統功能。

ASP.NET Identity授權機制,可以在系統運行中動態變更使用者所屬的角色,但是卻不能動態變更角色可以使用的功能。這是因為在ASP.NET Identity裡,使用者屬於哪個角色的設定儲存於資料庫可以動態變更,而角色可以使用那些功能的設定則是定義在程式碼沒有辦法動態變更。雖然這樣的授權機制已經可以符合大部分的開發需求,但在需要動態變更角色使用那些功能的開發專案中,開發人員就沒有機會使用到ASP.NET Identity豐富的驗證授權機制。

  • 領域模型

    前言01

  • 角色可以使用那些功能

    public class HomeController : Controller
    {
        [Authorize(Roles = "Admin")]
        public ActionResult Contact() { ... }
    
        [Authorize(Roles = "Guest")]
        public ActionResult Contact() { ... }
    }
    
  • 使用者屬於哪個角色

    前言02

解決方案

本篇文章介紹一個基於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驗證機制之外,也可以在系統運行中動態變更儲存於資料庫的授權設定:使用者所屬的角色、角色擁有的權限,讓系統的授權設定更加靈活多變,用以滿足更多的用戶需求。

  • 領域模型

    前言03

  • 權限可以使用哪些功能

    public class HomeController : Controller
    {
        [RBACAuthorize(Permission = "AboutAccess")]
        public ActionResult Contact() { ... }
    
        [RBACAuthorize(Permission = "ContactAccess")]
        public ActionResult Contact() { ... }
    }
    
  • 權限屬於哪個角色

    前言04

  • 使用者屬於哪個角色

    前言05

建立系統站台

  1. 首先開啟Visual Studio建立一個「完全空白」的ASP.NET Web 應用程式。

    安裝01

    安裝02

  2. 接著開啟NuGet管理工具,搜尋並安裝:「CLK.AspNet.Identity.Mvc Template

    安裝03

  3. 安裝需要花費一些時間,安裝完畢後即可看到必要檔案都已加入至專案。

    安裝04

  4. 安裝好CLK.AspNet.Identity之後,按下Visual Studio的執行按鈕,就可以在瀏覽器上看到預設的首頁內容。

    安裝05

  5. 回到Visual Studio開啟專案中的HomeController,可以看到預設權限可以使用哪些功能的程式碼。

    public class HomeController : Controller
    {
        [RBACAuthorize(Permission = "AboutAccess")]
        public ActionResult Contact() { ... }
    
        [RBACAuthorize(Permission = "ContactAccess")]
        public ActionResult Contact() { ... }
    }
    

變更角色的權限

  1. 使用預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:About,因為guest@example.com屬於Guest群組、而Guest群組沒有AboutAccess權限,所以會收到403拒絕訪問的頁面內容。

    變更角色的權限01

    變更角色的權限02

    變更角色的權限03

  2. 使用預設的管理帳號登入(ID:admin@example.com, PW:admin),點擊頁面選單按鈕:PermissionsAdmin進入權限管理頁面,編輯AboutAccess權限,讓Guest群組擁有AboutAccess權限。

    變更角色的權限04

    變更角色的權限05

  3. 更換回預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:About,因為現在Guest群組擁有AboutAccess權限,所以可以瀏覽About頁面內容。

    變更角色的權限06

變更使用者的角色

  1. 使用預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:Contact,因為guest@example.com屬於Guest群組、而Guest群組沒有ContactAccess權限,所以會收到403拒絕訪問的頁面內容。

    變更使用者的角色01

    變更使用者的角色02

    變更使用者的角色03

  2. 使用預設的管理帳號登入(ID:admin@example.com, PW:admin),點擊頁面選單按鈕:UsersAdmin進入使用者管理頁面,編輯guest@example.com使用者,讓guest@example.com使用者加入到Admin群組。

    變更使用者的角色04

    變更使用者的角色05

  3. 更換回預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:Contact,因為現在guest@example.com屬於Admin群組,而Admin群組擁有ContactAccess權限,所以可以瀏覽Contact頁面內容。

    變更使用者的角色06

新增系統的權限

  1. 回到Visual Studio編輯新功能,首先在HomeController增加一個新功能「News」、設定NewsAccess權限可以使用這個功能,並且在Viwes裡面加上對應的變更。

    public class HomeController : Controller
    {
        [RBACAuthorize(Permission = "NewsAccess")]
        public ActionResult News()
        {
            ViewBag.Message = "Your news page.";
    
            return View();
        }
    }
    
  2. 按下Visual Studio的執行按鈕,可以在瀏覽器上看到預設的首頁內容,並且內容中多了一個名稱為News的頁面選單按鈕。

    新增系統的權限01

  3. 使用預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:News,這時因為系統裡沒有設定NewsAccess權限,所以會收到PermissionName not found.的錯誤訊息頁面。

    新增系統的權限02

    新增系統的權限03

    新增系統的權限04

  4. 使用預設的管理帳號登入(ID:admin@example.com, PW:admin),點擊頁面選單按鈕:PermissionsAdmin進入權限管理頁面,新增NewsAccess權限,並且讓Guest群組擁有NewsAccess權限。

    新增系統的權限05

    新增系統的權限06

  5. 更換回預設的訪客帳號登入(ID:guest@example.com, PW:guest),點擊頁面選單按鈕:News,因為現在Guest群組擁有NewsAccess權限,所以可以瀏覽News頁面內容。

    新增系統的權限07

期許自己
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。