首页 > 编程语言 >Asp.Net Core -Authorizationz授权

Asp.Net Core -Authorizationz授权

时间:2024-07-03 16:30:48浏览次数:1  
标签:Core Asp string context policy Net PermissionAuthorizationRequirement public Per

授权的内部实现参考

动态授权参考

 

动态授权

基于权限的授权

1.定义权限-Permissions

 public class Permissions
 {
     public const string Admin = "Admin";
     public const string Users = "Users";
     public const string UserCreate = Users+ ".Create";
     public const string UserUpdate = Users+ ".Update";
     public const string UserDelete = Users+ ".Delete";
 }

 

2.定义权限Requirement

public class PermissionAuthorizationRequirement : IAuthorizationRequirement
{
    //表示权限的名称与Permission中常量对应
    public string Name { get; set; }
    public PermissionAuthorizationRequirement(string name)
    {
        Name = name;
    }
}

 

3.自定义授权Handler

public class PermissionAuthorizationHandler : AuthorizationHandler<PermissionAuthorizationRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionAuthorizationRequirement requirement)
    {
        //判断用户是否有某个角色
        if (context.User.IsInRole(Permissions.Admin))
        {
           context.Succeed(requirement);
        }
        else
        {
            //取出登录用户中ClaimType为Permission的项取出,并获取其 Value 组成一个 List<string>
            //var permissions = context.User.Claims.Where(p => p.Type == "Permissions").Select(p => p.Value).ToList();
            var permissions = context.User.Claims.Where(p => p.Type == nameof(Permissions)).Select(p => p.Value).ToList();
            //验证requirement是否满足授权(验证用户权限中是否存在requirement<请求中需要的权限>中的权限)
            if (permissions.Any(p => p.StartsWith(requirement.Name)))
            {
                //表示将验证成功的requirement从待验证的Requirements中移除(具体内容查看AuthorizationHandlerContext源码)
                context.Succeed(requirement);
            }
        }
        return Task.CompletedTask;
    }
}

 

4.注册Handler

在Program中注册

builder.Services.AddSingleton<IAuthorizationHandler, PermissionAuthorizationHandler>();

 

5.根据定义的权限添加权限策略

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy(Permissions.Users, policy => policy.AddRequirements(new PermissionAuthorizationRequirement(Permissions.Users)));
    options.AddPolicy(Permissions.UserCreate, policy => policy.AddRequirements(new PermissionAuthorizationRequirement(Permissions.UserCreate)));
    options.AddPolicy(Permissions.UserUpdate, policy => policy.AddRequirements(new PermissionAuthorizationRequirement(Permissions.UserUpdate)));
    options.AddPolicy(Permissions.UserDelete, policy => policy.AddRequirements(new PermissionAuthorizationRequirement(Permissions.UserDelete)));
});

 

6.使用授权策略

 以上方式需要对每个策略去做添加过于繁琐,可以通过MVC过滤器调用IAuthorizationService来简化操作

 

7.自定义过滤器-PermissionAuthorizeAttribute

[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple =true,Inherited =true)]
public class PermissionAuthorizeAttribute : Attribute, IAsyncAuthorizationFilter
{
    public string Name { get; set; }
    public PermissionAuthorizeAttribute(string name)
    {
        Name = name;
    }
    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
       var authorizationService=context.HttpContext.RequestServices.GetRequiredService<IAuthorizationService>();
        //调用AuthorizeAsync方法
        var authorizationResult = await authorizationService.AuthorizeAsync(context.HttpContext.User, null, new PermissionAuthorizationRequirement(Name));
        if (!authorizationResult.Succeeded)
        {
            context.Result = new ForbidResult();
        }
    }
}

使用授权策略改为

 

标签:Core,Asp,string,context,policy,Net,PermissionAuthorizationRequirement,public,Per
From: https://www.cnblogs.com/sugarwxx/p/18282062

相关文章

  • Asp.NET identity以及Owin
    》》》Identity是集成到Owin框架中中●Microsoft.AspNet.Identity.Core:Identity的核心类库,实现了身份验证的核心功能,并提供了拓展接口。●Microsoft.AspNet.Identity.EntityFramework:Identity数据持久化的EF实现。●Microsoft.AspNet.Identity.OWIN:基于Identi......
  • .Net知识技能大全
    .Net知识技能大全更多请见https://www.dotnetshare.comC#常见运算符一元运算符(+、-、!、~、++、--)算术运算符(*、/、%、+、–)移位运算符(<<、>>)关系和类型测试运算符(==、!=、<、>、<=、>=、is和as)逻辑运算符(&、^和|)条件逻辑运算符(&&和||)空合并运算符(??)条件运......
  • CentOS Stream 8 发布.net 8 webapi
    参考资料https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-rhel#where-is-centos-linux 微软好像不持支.net7所以把demo换成.net8sudodnfinstalldotnet-sdk-8.0 然后就开始报错,大致意思就是无法解析,找不到地址资源进入yum的repos目录cd/etc/yum.rep......
  • 读取.net core配置文件appsetting.json内容
    appsetting.json内容//省略部分代码...//代码生成相关"CodeCreatorInfo":{"xmlPath":"11111",//xml路径(绝对路径)"jsRootPaht":"2222",//js文件夹路径"Controllers":"333",//特殊Controller列表,逗号隔开......
  • lnternet 发展史
    一,lnternet发展史     ARPAnet(上世纪50年代二战结束)无线战场指挥通信协议落后TCP/IP     包交换      WEB(70年代 )   80年代     90年代  二,互联网的典型应用:96年到2008年第一代技术淘汰56Kbps实践使用2KB/......
  • 【云原生】Kubernetes-kubeadm升级版本
    一、版本升级当我们要用到新版本的一些功能和特性的时候或者当前版本太旧无法满足需要的时候势必要对Kubernetes集群进行升级。1.1、升级Master节点1.1.1、腾空节点[root@master~]#kubectlgetnodeNAMESTATUSROLESAGEVERSIONmaster......
  • Netsol SPI STT-MRAM 型号以及参数分享学习
    Serial(串口SPI)STT-MRAMDensityPartNumberVCCPackageTempSpeed1MS3A1004V0M-JI1A3.38WSON-40~85C108MHzS3A1004V0M-AI1A8SOP-40~85C108MHzS3A1004R0M-JI1A1.88WSON-40~85C108MHzS3A1004R0M-AI1A8SOP-40~85C108MHz2MS3A2004V0M-JI1A3.38WSON-40~85C108MHzS3A2004V0M-AI1......
  • Netsol MRAM : Parallel(并口PPI) STT-MRAM型号以及参数分享学习
    Parallel(并口PPI)STT-MRAMDensityPartNumberOrgVCCPackageTempSpeed1MS3R1016V1M-UI70x163.344TSOP-II-40~85C70nsS3R1016V1M-XI7048FBGA-40~85C70nsS3R1008V1M-UI70x83.344TSOP-II-40~85C70nsS3R1008V1M-XI7048FBGA-40~85C70ns2MS3R2016V1M-UI70x163.344TSOP-II-40~85......
  • 深度学习第一课 Neural Networks and Deep Learning
    NeuralNetworksandDeepLearningweek1深度学习概论1.1欢迎1.2什么是神经网络Relurecity:取不小于0的值我们把房屋的面积作为神经网络的输入(我们称之为x),通过一个节点(一个小圆圈),最终输出了价格(我们用y表示)。其实这个小圆圈就是一个单独的神经元。神经网络当你......
  • C#.NET FRAMEWORK .NET CORE .NET6 .NET8 判断是否Emoji
    C#.NETFRAMEWORK.NETCORE.NET6.NET8判断是否Emoji 工具类:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleThreadTimer{publicclassEmojiUtil{///<s......