zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    现代操作系统-读者/写者问题
    现代操作系统-进程互斥
    关于网页强制被跳转到wpkg.org的解决
    Leetcode Count Prime
    Leetcode Add Two Numbers
    Leetcode Two Sum
    can't find -lsocket的解决办法
    删除Windows右键不用的选项
    Linux下的另一个词典GoldenDict
    spark执行例子eclipse maven打包jar
  • 原文地址:https://www.cnblogs.com/weihanli/p/10328554.html
Copyright © 2011-2022 走看看