asp.net core根據(jù)用戶權(quán)限控制頁(yè)面元素的顯示
Intro
在 web 應(yīng)用中我們經(jīng)常需要根據(jù)用戶的不同允許用戶訪問(wèn)不同的資源,顯示不同的內(nèi)容碌冶,之前做了一個(gè) AccessControlHelper 的項(xiàng)目疙驾,就是解決這個(gè)問(wèn)題的喜鼓。
asp.net core 支持 TagHelper 和 基于 Policy 的認(rèn)證
AccessControlHelper 從1.4.0 版本開始支持 TagHelper 和 基于 Policy 的認(rèn)證
TagHelper 用法
在 Views 目錄下的 ~ViewImport.cshtml
中加入 TagHelper 引用
@addTagHelper *, WeihanLi.AspNetMvc.AccessControlHelper
在需要有權(quán)限才能訪問(wèn)的元素上加上 asp-access
堂油,支持自定義一個(gè)key惯退,如果有特殊的key可以設(shè)置 asp-access-key
披粟,下面有個(gè)示例
<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("系統(tǒng)設(shè)置管理", "Index", "SystemSettings")</li>
<li class="list-group-item">
@Html.ActionLink("微信設(shè)置管理", "Index", new {
controller = "Config",
area = "Wechat"
})
</li>
</ul>
示例代碼完整源碼
實(shí)現(xiàn)自己的訪問(wèn)策略
可以參考這個(gè)項(xiàng)目的實(shí)現(xiàn) https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation.Helper/Services/PermissionRequireStrategy.cs
public class AdminPermissionRequireStrategy : IResourceAccessStrategy
{
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");
}
}
這個(gè)示例實(shí)現(xiàn)的比較簡(jiǎn)單咒锻,只是判斷了一下是否有 Admin
角色,可以根據(jù)實(shí)際情況根據(jù)請(qǐng)求的地址以及當(dāng)前登錄用戶及其它可能用到的信息去判斷是否有權(quán)限訪問(wèn)守屉。
注冊(cè)服務(wù)
在 Startup 文件中 ConfigureServices 中注冊(cè)權(quán)限服務(wù)惑艇,注冊(cè)自己的訪問(wèn)策略
// register access control service
services.AddAccessControlHelper<Filters.AdminPermissionRequireStrategy, Filters.AdminOnlyControlAccessStragety>();
Policy 訪問(wèn)使用
在需要設(shè)置權(quán)限的 Action 或者 Controller 上加 [Authorize("AccessControl")]
或者 [Authorization(Policy="AccessControl")]
這兩種方式是 asp.net core 下支持的 Policy 方式使用
也支持比較傳統(tǒng)的直接使用 [AccessControl]
,AccessControl
和 NoAccessControl
可以搭配使用拇泛, 類似于 Authorize
和 AllowAnoymous
TagHelper 使用效果實(shí)例
普通用戶: Alice/Test1234
管理員: admin/Admin888
請(qǐng)不要修改密碼/或者刪除已有賬號(hào)滨巴。。俺叭。
管理員用戶登錄看到的界面:
查看源碼:
<div class="table-body" id="div_main">
<ul class="list-group">
<!-- ... -->
</ul>
<ul class="list-group" asp-access>
<!-- ... -->
</ul>
</div>
普通用戶登錄看到的界面:
查看源碼:
<div class="table-body" id="div_main">
<ul class="list-group">
<!-- ... -->
</ul>
</div>