asp.net core根據使用者許可權控制頁面元素的顯示
asp.net core根據使用者許可權控制頁面元素的顯示
Intro
在 web 應用中我們經常需要根據使用者的不同允許使用者訪問不同的資源,顯示不同的內容,之前做了一個 AccessControlHelper 的專案,就是解決這個問題的。
asp.net core 支援 TagHelper 和 基於 Policy 的認證
AccessControlHelper 從1.4.0 版本開始支援 TagHelper 和 基於 Policy 的認證
TagHelper 用法
在 Views 目錄下的 ~ViewImport.cshtml
中加入 TagHelper 引用
@addTagHelper *, WeihanLi.AspNetMvc.AccessControlHelper
在需要有許可權才能訪問的元素上加上 asp-access
,支援自定義一個key,如果有特殊的key可以設定 asp-access-key
,下面有個示例
<ul class="list-group" asp-access asp-access-key="12334"> <li role="separator" class="list-unstyled"> <br /> </li> <li class="list-group-item">@Html.ActionLink("使用者管理", "UserList", "Account")</li> <li class="list-group-item">@Html.ActionLink("操作日誌檢視", "Index", "OperationLog")</li> <li class="list-group-item">@Html.ActionLink("系統設定管理", "Index", "SystemSettings")</li> <li class="list-group-item"> @Html.ActionLink("微信設定管理", "Index", new { controller = "Config", area = "Wechat" }) </li> </ul>
示例程式碼完整 原始碼
實現自己的訪問策略
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using WeihanLi.AspNetMvc.AccessControlHelper; using WeihanLi.Common.Models; namespace ActivityReservation.Filters { public class AdminPermissionRequireStrategy : IActionAccessStrategy { private readonly IHttpContextAccessor _accessor; public AdminPermissionRequireStrategy(IHttpContextAccessor accessor) { _accessor = accessor; } public bool IsCanAccess(string accessKey) { var user = _accessor.HttpContext.User; return user.Identity.IsAuthenticated && user.IsInRole("Admin"); } public IActionResult DisallowedCommonResult => new ContentResult { Content = "No Permission", ContentType = "text/plain", StatusCode = 403 }; public IActionResult DisallowedAjaxResult => new JsonResult(new JsonResultModel { ErrorMsg = "No Permission", Status = JsonResultStatus.NoPermission }); } public class AdminOnlyControlAccessStragety : IControlAccessStrategy { private readonly IHttpContextAccessor _accessor; public AdminOnlyControlAccessStragety(IHttpContextAccessor httpContextAccessor) => _accessor = httpContextAccessor; public bool IsControlCanAccess(string accessKey) { var user = _accessor.HttpContext.User; return user.Identity.IsAuthenticated && user.IsInRole("Admin"); } } }
這個示例實現的比較簡單,只是判斷了一下是否有 Admin
角色,可以根據實際情況根據請求的地址以及當前登入使用者及其它可能用到的資訊去判斷是否有許可權訪問。
註冊服務
在 Startup 檔案中 ConfigureServices 中註冊許可權服務,註冊自己的訪問策略
// register access control service services.AddAccessControlHelper<Filters.AdminPermissionRequireStrategy, Filters.AdminOnlyControlAccessStragety>();
Policy 訪問使用
在需要設定許可權的 Action 或者 Controller 上加 [Authorize("AccessControl")]
或者 [Authorization(Policy="AccessControl")]
這兩種方式是 asp.net core 下支援的 Policy 方式使用
也支援比較傳統的直接使用 [AccessControl]
, AccessControl
和 NoAccessControl
可以搭配使用, 類似於 Authorize
和 AllowAnoymous
TagHelper 使用效果例項
普通使用者: Alice/Test1234
管理員: admin/Admin888
檢視 後臺首頁
管理員使用者登入看到的介面:
普通使用者登入看到的介面: