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
請不要修改密碼/或者刪除已有賬號。。。
查看后台首頁
管理員用戶登錄看到的界面:
普通用戶登錄看到的界面: