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

摘要:
通过前一项NetCore的官方JWT授权验证已从JWT认证中学习。首先,我们创建一个类PermissionRequirement来继承接口IAuthorizationRequirement。这个类是接口和角色之间的关系类。可以根据需要添加此类中的字段。publicclassPermissionRequirement:IAuthorizationRequirement{publicstringUrl{get;set;}publicList<string>角色{get;set;}}然后创建一个处理类PermissionHandler来继承AuthorizationHandler类,以处理请求中接口和角色权限之间的关系。参考文章:ASP。NETCore使用JWT定制角色/策略,以授权需要从前端到后端实现的接口[.NETCore]37 JWT完美实现权限和接口的动态分配

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

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

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

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

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

public class PermissionHandler : AuthorizationHandler<PermissionRequirement>{
    protected override asyncTask 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 incontext.User.Identities)
        {
            foreach(var claim int.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完美实现权限与接口的动态分配

免责声明:文章转载自《.Net Core JWT 动态设置接口与权限》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WinForm控件之【RichTextBox】SQL Server error下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)

原文:http://www.cnblogs.com/codeon/p/6123863.html#3580351 1.完全开放的接口 有没有这样的接口,谁都可以调用,谁都可以访问,不受时间空间限制,只要能连上互联网就能调用,毫无安全可言。 实话说,这样的接口我们天天都在接触,你查快递,你查天气预报,你查飞机,火车班次等,这些都是有公共的接口。 我把这称之为裸...

Redis的序列化

本文参考http://www.cnblogs.com/yaobolove/p/5632891.html Redis通过序列化存对象。 首先来了解为什么实现序列化接口?     当一个类实现了Serializable接口(该接口仅标记为接口,不包含任何方法定义),表示该类可以序列化。序列化的目的是将一个实现了Serializable接口的对象转化成一个字节序...

Resource接口,及资源

Resource介绍 编码的时候,除了代码本身,我们还需要对外部的资源进行处理。例如:URL资源、URI资源、File资源、ClassPath相关资源、服务器相关资源(VFS等)等等。 而这些资源的处理是类似而繁琐的,如:打开资源、读取资源、关闭资源。 所以Spring提供了一个专门的接口Resource 用于统一这些底层资源的访问。 就是说,Spring...

php api接口安全设计 sign理论

一. url请求的参数包括:timestamp,token, username,sign 1. timestamp:         时间戮 2. token:       登陆验证时,验证成功后,生成唯一的token(可以为uuid),并把token储存到缓存(redis)里 ,键为username,值为token 3. username:      用...

usb2.0、usb3.0、usb3.1、type-c 接口含义与区别

简单说: usb3.0 比2.0的传输速率快,充电快,能向下兼容2.0 usb3.1 通常是指 usb3.1 gen2,比3.0的传输速率更快、充电更快,同兼容 type-c 通常是指 usb3.1的一种接口形状,总共三大类,c就是第三大类 先看下usb2.0接口 usb2.0 理论传输速率480Mbps,即60MB/s 四引脚 供电最高允许标准5V...

阿里巴巴Java开发手册(命名规范/常量定义篇)——查自己的漏-补自己的缺

一、编程规约 (一) 命名规约 1. 【强制】所有编程相关命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例: _name / __name / $Object / name_ / name$ / Object$ 6. 【强制】抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的...