[ASP.NET MVC] 使用CLK.AspNet.Identity提供依權限顯示選單項目的功能

摘要:[ASP.NET MVC] 使用CLK.AspNet.Identity提供依權限顯示選單項目的功能

[ASP.NET MVC] 使用CLK.AspNet.Identity提供依權限顯示選單項目的功能

CLK.AspNet.Identity

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

問題情景

開發人員在系統內套用CLK.AspNet.Identity後,就可以依照使用者的權限,來限制使用者能夠使用那些功能。當使用者透過瀏覽器進入使用權限的功能頁面時,就會收到HTTP的403狀態碼,用來告知使用者沒有權限進入該頁面。

問題情景01

以提供更好的使用者體驗角度來說,使用者點擊選單項目後,得到沒有權限進入該頁面的回應。這樣的操作流程,很容易讓使用者失去耐心。為了提供更好的使用者體驗,系統應該依使用者的權限來顯示選單項目,只顯示有權限可以進入使用的選單項目,用以減少使用者操作錯誤的機會。

問題情景02

解決方案

在套用CLK.AspNet.Identity的系統裡,可以使用HasPermission這個擴充方法,來提供依權限顯示選單項目的功能。使用方法如下:

  1. 在系統裡加入一個新的ProductController、ProductViews,並且依照下列範例程式,加入Method及對應的權限:ProductAddAccess、ProductRemoveAccess。

    public class ProductController : Controller
    {
        [RBACAuthorize(Permission = "ProductAddAccess")]
        public ActionResult Add()
        {
            ViewBag.Message = "Your product add page."; 
            return View();
        }
    
        [RBACAuthorize(Permission = "ProductRemoveAccess")]
        public ActionResult Remove()
        {
            ViewBag.Message = "Your product remove page.";  
            return View();
        }
    }
    
  2. 編輯Views\Shared_Layout.cshtml,並且依照下列範例,使用HasPermission這個擴充方法,來依照使用者的權限顯示選單項目。

    <div class="col-md-12" style="background-color:#222">
        <div class="container">
            @if (User.HasPermission("ProductAddAccess"))
            { 
                @Html.ActionLink("Product add", "Add", "Product", null, new { @class = "btn btn-primary" }) 
            }
    
            @if (User.HasPermission("ProductRemoveAccess"))
            { 
                @Html.ActionLink("Product remove", "Remove", "Product", null, new { @class = "btn btn-primary" }) 
            }
        </div>
    </div>
    
  3. 完成上述程式程式開發工作之後,還需要進入系統,設定使用者權限。在下面這個範例中,示範使用Permission管理頁面,將權限開放給Admin群組使用。

    解決方案01

  4. 使用預設的管理帳號登入(ID:admin@example.com, PW:admin)登入後,可以看到因為admin@example.com屬於Admin群組、而Admin群組擁有ProductAddAccess權限,所以系統選單中可以看到Product add這個選單項目。

    解決方案02

  5. 更換使用預設的訪客帳號登入(ID:guest@example.com, PW:guest)登入後,可以看到因為guest@example.com屬於Guest群組、而Guest群組沒有ProductAddAccess權限,所以系統選單中看不到Product add這個選單項目。

    解決方案03

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