• .Net Core JWT 动态设置接口与权限


    通过上一篇.Net Core官方的 JWT 授权验证学习到了JWT的授权。可以发现一个问题,就是如果每个接口可以使用的角色都是写死的,这样如果有所修改会非常麻烦,虽然用policy可以一定程度上缓解,但是还是不能根治。

    所以,就需要动态的设置接口与权限,由我们自己来处理。

    我们先创建一个类 PermissionRequirement 继承接口 IAuthorizationRequirement,这个类是接口与角色的关系类,里面的字段可以按自己的需要添加。

    public class PermissionRequirement : IAuthorizationRequirement
    {
      public string Url { get; set; }
      public List<string> Roles { get; set; }
    }

    之后创建一个处理类 PermissionHandler 继承 AuthorizationHandler 类,来处理请求中接口和角色权限的关系。

    public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
    {
        protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
        {
            //模拟从数据库或者缓存中取出的访问url的权限数据
            var roles = new List<PermissionRequirement>();
            roles.Add(new PermissionRequirement() { Url = "weatherforecast", Roles = new List<string>() { "system" } });
            //JWT的token中的声明等信息都会自动解析在context中
            var resource = ((Microsoft.AspNetCore.Routing.RouteEndpoint)context.Resource).RoutePattern;
            foreach(var t in context.User.Identities)
            {
                foreach(var claim in t.Claims)
                {
                    //通过Type可以判断声明的类型,这里处理role的声明获取角色信息
                    if(claim.Type == ClaimTypes.Role)
                    {
                        if(roles.Exists(x => x.Roles.Exists(role => role == claim.Value) && x.Url == resource.RawText.ToLower()))
                        {
                            context.Succeed(requirement);
                            return;
                        }
                    }
                }
            }
            context.Fail();
            return;
        }
    }

    在 Startup 类中其他都不变,只需要添加在 ConfigureServices 方法中添加上如下代码即可,通过以来注入 PermissionHandler 类来替换成我们的处理类。

    services.AddAuthorization(option => {
        //option.AddPolicy("adminOrSystem", policy => policy.RequireRole("admin", "system"));
        option.AddPolicy("Permission", policy => policy.AddRequirements(permissionRequirement));
    });
    services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
    // 将授权必要类注入生命周期内
    services.AddSingleton(permissionRequirement);

    最后只需要在接口或控制器上添加 [Authorize(Policy = "Permission")] 就可以啦,只要有该特性的接口访问都会走我们的处理类 PermissionHandler 判断接口和角色的关系,从而实现了动态设置接口和权限的要求。

    我这里的代码比较的简陋,最低限度的实现,可以自己根据需求完善。也可以看下面的参考文章。

    参考文章:

    ASP.NET Core 使用 JWT 自定义角色/策略授权需要实现的接口

    从壹开始前后端分离[.NetCore] 37 ║JWT完美实现权限与接口的动态分配

  • 相关阅读:
    Linux-nmap
    MongoDb注意事项
    HTML如何转XTML
    Centos 64位 Install certificate on apache 即走https协议
    CentOS 下搭建部署独立SVN服务器全程详解(5.5)
    LNMP安装与配置
    64位CentOS 6.0下搭建LAMP环境
    Apache遇到的问题:APR not found
    超详细LAMP环境搭建
    偏方治百病
  • 原文地址:https://www.cnblogs.com/xwc1996/p/14091448.html
Copyright © 2020-2023  润新知