摘要:[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狀態碼,用來告知使用者沒有權限進入該頁面。
以提供更好的使用者體驗角度來說,使用者點擊選單項目後,得到沒有權限進入該頁面的回應。這樣的操作流程,很容易讓使用者失去耐心。為了提供更好的使用者體驗,系統應該依使用者的權限來顯示選單項目,只顯示有權限可以進入使用的選單項目,用以減少使用者操作錯誤的機會。
解決方案
在套用CLK.AspNet.Identity的系統裡,可以使用HasPermission這個擴充方法,來提供依權限顯示選單項目的功能。使用方法如下:
-
在系統裡加入一個新的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(); } }
-
編輯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>
-
完成上述程式程式開發工作之後,還需要進入系統,設定使用者權限。在下面這個範例中,示範使用Permission管理頁面,將權限開放給Admin群組使用。
-
使用預設的管理帳號登入(ID:admin@example.com, PW:admin)登入後,可以看到因為admin@example.com屬於Admin群組、而Admin群組擁有ProductAddAccess權限,所以系統選單中可以看到Product add這個選單項目。
-
更換使用預設的訪客帳號登入(ID:guest@example.com, PW:guest)登入後,可以看到因為guest@example.com屬於Guest群組、而Guest群組沒有ProductAddAccess權限,所以系統選單中看不到Product add這個選單項目。
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。