首页 > 编程语言 >asp.net core 中基于策略的授权-自定义授权

asp.net core 中基于策略的授权-自定义授权

时间:2024-03-05 13:47:32浏览次数:25  
标签:core 自定义 Permission PermissionAuthorizeAttribute context 授权 权限 public

前两篇文章扫盲篇进阶篇中介绍了基本的asp.net core 中基于策略的授权的使用方法。

使用策略授权时,只能指定策略,不能配置其他信息。

    [Authorize(Policy = "AtLeast21")]//指定要验证的策略
    public class AlcoholPurchaseController : Controller
    {
        public IActionResult Index() => View();
    }

  

如果我们有很多种授权逻辑,就要有很多种策略。有没有一种可能,可以在指定授权策略时,传入一些参数,灵活的控制授权呢。

当然是可以的。

我们包装一个自己的验证特性PermissionAuthorizeAttribute类,继承自AuthorizeAttribute。构造函数允许传入权限类型参数,并且执行父类构造函数时指定策略“Permission”。

    /// <summary>
    /// 继承自AuthorizeAttribute,AuthorizeAttribute要求指定策略,那这里就固定为Permission。
    /// 支持接受一个权限集合(Permission[]),可以指定要验证的权限
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
    public class PermissionAuthorizeAttribute : AuthorizeAttribute
    {
        /// <summary>
        /// </summary>
        /// <param name="permissions"></param>
        public PermissionAuthorizeAttribute(params Permission[] permissions) : base("Permission") => Permissions = permissions;
 
        public Permission[] Permissions { get; set; }
    }

  权限类型是一个枚举,标记什么样的权限,这里就简单的做个示例。允许传入多个,应该是or的关系。如果要验证多个权限类型,是并且的关系。那应该加多个特性。

    public enum Permission
    {
        /// <summary>
        /// 用户有明细
        /// </summary>
        HasName = 1,
 
        /// <summary>
        /// 用户有邮箱
        /// </summary>
        HasEmail = 2,
    }

  使用的时候如下,可以看到访问HasNameController时,授权校验了Permission.HasName权限。

    [PermissionAuthorize(Permission.HasName)]
    public class HasNameController : Controller
    {
        public IActionResult Index() => View();
    }
 
 
    [PermissionAuthorize(Permission.HasEmail)]
    public class HasEmailController : Controller
    {
        public IActionResult Index() => View();
    }

  

那么handler中怎么拿到权限类型信息呢?我们知道handler校验函数有两个参数,一个是TRequirement,startup类中配置策略时创建的,这个是固定的。一个是AuthorizationHandlerContext,上下文。听听,上下文,就感觉应该从这里拿。

AuthorizationHandlerContext有个Resource属性,解释是“The optional resource to evaluate the Requirements against.”要对Requirements进行评估的可选资源。我理解如果你验证特性放在controller上,Resource就是这个controller。如果你验证特性放在action上,Resource就是这个action。我们使用在controller上了,那么我们就可以通过controller对象找到其上面的特性信息。

    public class PermissionAuthorizationHandler : AuthorizationHandler<PermissionRequirement>
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
            PermissionRequirement requirement)
        {
            var attributes = new List<PermissionAuthorizeAttribute>();
 
            if ((context.Resource as RouteEndpoint) is RouteEndpoint route)
            {
                //通过元数据Metadata能找到其上的PermissionAuthorizeAttribute特性实例
                var tempAttributes = route.Metadata.Where(x => x is PermissionAuthorizeAttribute);
                if (tempAttributes != null && tempAttributes.Count() > 0)
                {
                    attributes.AddRange(tempAttributes.Select(x => (PermissionAuthorizeAttribute)x));
                }
            }
            //特性实例上的Permissions信息
            var permissions = attributes.Select(x => x.Permissions);
 
            //后面就是自己的验证逻辑了
            foreach (var item in permissions)
            {
                if (item.Any(x => x == Permission.HasName) && !context.User.HasClaim(c => c.Type == ClaimTypes.Name))
                {
                    context.Fail();
                    return Task.CompletedTask;
                }
                if (item.Any(x => x == Permission.HasEmail) && !context.User.HasClaim(c => c.Type == ClaimTypes.Email))
                {
                    context.Fail();
                    return Task.CompletedTask;
                }
            }
            context.Succeed(requirement);
            return Task.CompletedTask;
        }
    }

  startup正常注册就行

services.AddAuthorization(options =>
            {
                options.AddPolicy("Permission", policy =>
                    policy.Requirements.Add(new PermissionRequirement()));
 
 
            });
 
            services.AddScoped<IAuthorizationHandler, PermissionAuthorizationHandler>();

  来自:https://blog.csdn.net/yangguosheng/article/details/129169277

 

标签:core,自定义,Permission,PermissionAuthorizeAttribute,context,授权,权限,public
From: https://www.cnblogs.com/djd66/p/18053850

相关文章

  • NetCore3.1 引入PostgerSql + DbFirst
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、新建控制台项目PostgreSQLApp,引入如下包<ProjectSdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp3.1</TargetFramework></Prope......
  • ASP.NET Core - 配置系统之配置读取
    一个应用要运行起来,往往需要读取很多的预设好的配置信息,根据约定好的信息或方式执行一定的行为。配置的本质就是软件运行的参数,在一个软件实现中需要的参数非常多,如果我们以HardCode(硬编码)的方式写在应用代码中,这样配置就会很乱,而且后续也不容易修改。乱而多,而且不容易修改,......
  • ASP.NET Core策略授权和ABP授权
    首先我们来创建一个WebAPI应用。然后引入Microsoft.AspNetCore.Authentication.JwtBearer包。策略Startup类的ConfigureServices方法中,添加一个策略的形式如下:services.AddAuthorization(options=>{options.AddPolicy("AtLeast21",policy=>......
  • .NET Core连接MongoDB数据库
    MongoDB是一个非关系型数据库,它以文档形式存储数据,具有高性能、可扩展和灵活的特点。在.NETCore中使用MongoDB驱动程序可以很方便地连接和操作MongoDB数据库。本文将介绍如何在.NETCore项目中连接MongoDB数据库,并提供一些常用的操作示例。安装MongoDB驱动程序在.NETCore项目中......
  • uni-app自定义图标
    1.首先去阿里巴巴矢量图标库找到自己需要的图标,比如2.鼠标移到图标上,有个购物车的小图标(添加入库),然后点击右上角的购物车小图标,弹出弹框,选择添加至项目3.去资源管理里面找到我的项目,就可以看到刚才咱们自己添加的图标4.可以在项目设置中设置自己需要的配置5.点击下载至......
  • 深入解析ASP.NET Core MVC应用的模块化设计[上篇]
    ASP.NETCoreMVC的“模块化”设计使我们可以构成应用的基本单元Controller定义在任意的模块(程序集)中,并在运行时动态加载和卸载。这种为“飞行中的飞机加油”的方案是如何实现的呢?该系列的两篇文章将关注于这个主题,本篇着重介绍“模块化”的总体设计,下篇我们将演示将介绍“分散定......
  • .net core 6.0后台 Vue2前台 导出Excel文件
    要导出这样一个Excel表格:1.后端API下载安装包:EPPlus2.后端代码点击查看代码///<summary>///接口///</summary>///<returns>结果</returns>[HttpGet]publicIActionResultExportTab(){varli......
  • 【HMS Core】ToolKit,Merchant Service has not been enabled yet
    ​【问题描述】集成应用内支付时,一直提示未开通商户服务,实际商户服务已开通。​【解决方案】一般是由于AndroidStudio里的开发者账户和联盟网站对应开通商户服务的不是同一个账户造成的​PS:如果有团队帐号,还需注意,是否是团队帐号开通的,需选择正确的team。​......
  • 【HMS Core】关于应用内支付密钥升级问题
    ​【问题描述】相信最近大家都收到了关于应用内支付密钥升级的邮件,今天集中解答一下大家比较关心的问题​ 【解决方案】1、如果您的应用已经集成了应用内支付SDK,建议可以按照通知升级一下应用内支付密钥,如果没有集成并使用应用内支付的能力的话,那就不需要进行相关处理,忽略邮......
  • .Net Core(六) 面向切面编程
    简介面向切面编程(AOP,Aspect-OrientedProgramming)是一种编程范式,旨在增强现有的面向对象编程(OOP,Object-OrientedProgramming)范式。AOP通过在程序执行过程中动态地将横切关注点(cross-cuttingconcerns)从它们所影响的对象中分离出来,并将其模块化,以便重用和管理。在传统的面向对......