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>

示例代碼完整源碼

實現自己的訪問策略

可以參考這個項目的實現 https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation.Helper/Services/PermissionRequireStrategy.cs

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]AccessControlNoAccessControl 可以搭配使用, 類似於 AuthorizeAllowAnoymous

TagHelper 使用效果實例

測試登錄地址

普通用戶: Alice/Test1234
管理員: admin/Admin888

請不要修改密碼/或者刪除已有賬號。。。

查看后台首頁

管理員用戶登錄看到的界面:

admin-user

普通用戶登錄看到的界面:

common-user

Reference


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM