为了账号安全,请及时绑定邮箱和手机立即绑定

asp.net core根据用户权限控制页面元素的显示

标签:
.NET

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 serviceservices.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

请不要修改密码/或者删除已有账号。。。

查看后台首页

管理员用户登录看到的界面:

webp

admin-user

普通用户登录看到的界面:

webp

common-user



作者:天天向上卡索
链接:https://www.jianshu.com/p/68169434532f


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消