CZGL.Auth: ASP.NET Core Jwt角色授权快速配置库
CZGL.Auth
CZGL.Auth 是一个基于 Jwt 实现的快速角色授权库,ASP.Net Core 的 Identity 默认的授权是 Cookie。而 Jwt 授权只提供了基础实现和接口,需要自己实现角色授权和上下文拦截等。
使用第三方开源类库,例如 IdentityServer4 ,过于复杂,学习成本和开发成本较高。
于是空闲时间,写了这个库。
基于角色授权
每个API均可授权
实时更新权限
快速配置
使用方法:
Nuget 中搜索 CZGL.Auth ,安装 1.0.0版本,适用于 ASP.NET Core 2.x。
注入服务
在 Startup.cs 中
using CZGL.Auth.Services;
ConfigureServices 中,注入服务
services.AddRoleService();
配置服务
在 Program 文件中创建一个方法,在启动网站前配置角色授权服务:
使用 AuthBuilder 可以配置授权认证的配置
引入
using CZGL.Auth.Services;
using CZGL.Auth.Models;
using CZGL.Auth.Interface;
你可以像这样快速配置:
new AuthBuilder()
.Security()
.Jump()
.Time(TimeSpan.FromMinutes(20))
.DefaultRole("user")
.End();
// 无需接收返回值,直接这样写即可
Security 中配置 密钥、默认用户的角色、Token颁发者、Token订阅者。
密钥应当使用私钥证书的文本内容;请设定一个无用的默认角色或者乱填一个无用的字符串,在认证失效或其它原因是,会使用此角色;这个默认角色是存放在系统中的。
Jump 中填写登录URL、无权访问时跳转URL和是否开启跳转功能。
如果不开启,则在失败时直接返回 401 ;如果开启,在用户没有登录或凭证已经失效时,会跳转到相应页面。
Time 中填写凭证失效的时间,即颁发的凭证有效时间,可以以分钟、秒为单位。一般都是设置20/30分钟。
DefaultRole 设置默认角色,这个默认角色是给为登录或凭证失效时设置,或者颁发凭证后系统删除了这个角色等使用。乱填就行,不要跟真正的用户角色名称一致即可。
角色授权
使用 RolePermission.AddRole() 可以增加一个角色,
var usera = new Role()
{
RoleName = "supperadmin",
Apis = new List<IApiPermission>
{
new ApiPermission{Name="A",Url="/api/Test/A" },
new ApiPermission{Name="AB",Url="/api/Test/AB" },
new ApiPermission{Name="AC",Url="/api/Test/AC" },
new ApiPermission{Name="ABC",Url="/api/Test/ABC" }
}
};
RolePermission.AddRole(usera);
RoleName :角色名称
Apis:角色能够访问的API
IApiPermission:一个API,Name API名称,Url API地址。
校验角色和API地址时,不区分大小写。
角色会存储到内存中,你可以随时添加或删除角色。例如从数据库中读取权限存储到系统中。
为了安全和避免同步问题,只允许以角色为单位操作。
RolePermission 中可以添加或删除角色。
登录、颁发凭证
创建 AccountController API控制器
private readonly AuthorizationRequirement _requirement;
public AccountController(AuthorizationRequirement requirement)
{
_requirement = requirement;
}
如果你不是用 AuthorizationRequirement 注入,那么颁发的会是上面设置的默认用户,这可能会导致授权问题。
登录:
[HttpPost("Login")]
public JsonResult Login(string username, string password)
{
// 中数据库中判断账号密码是否正确,并获取用户所属角色等角色
var user = UserModel.Users.FirstOrDefault(x => x.UserName == username && x.UserPossword == password);
if (user == null)
return new JsonResult(
new ResponseModel
{
Code = 0,
Message = "登陆失败!"
});
// 实例化加密和颁发 Token的类
EncryptionHash hash = new EncryptionHash();
// 将用户标识存储到系统中
_requirement.SetUserRole(user.Role);
//// 配置用户标识
//// 方法一
//var userClaims = new Claim[]
//{
// new Claim(ClaimTypes.Name,user.UserName),
// new Claim(ClaimTypes.Role,user.Role),
// new Claim(ClaimTypes.Expiration,DateTime.Now.AddMinutes(TimeSpan.FromMinutes(20)).ToString()),
//};
// 方法二
var userClaims = hash.GetClaims(username, user.Role);
// 颁发 token
var identity = hash.GetIdentity(userClaims);
var jwt = hash.BuildJwtToken(userClaims);
var token = hash.BuildJwtResponseToken(jwt);
return new JsonResult(
new ResponseModel
{
Code = 200,
Message = "登陆成功!请注意保存你的 Token 凭证!",
Data = token
});
}
原文地址:https://www.cnblogs.com/whuanle/p/11391356.html
- Java基础——集合框架
- Java基础——clone()方法浅析
- 【Python环境】matplotlib - 2D 与 3D 图的绘制
- 左求值表达式,堆栈,调试陷阱与ORM查询语言的设计
- Java基础——序列化
- 【Python环境】使用 scikit-learn 进行机器学习的简介
- Java基础——异常体系
- Java基础——数据类型之间的转换
- Java程序员面试宝典——重要习题整理
- Java8读文件方法代码学习
- .NET ORM 的 “SOD蜜”--零基础入门篇
- 【Spark研究】用Apache Spark进行大数据处理之入门介绍
- DataSet的灵活,实体类的方便,DTO的效率:SOD框架的数据容器,打造最适合DDD的ORM框架
- Java 内部类种类及使用解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用 HanLP 统计二元语法中的频次
- 算法集锦(13)|自然语言处理| Python代码的语义搜索引擎创建
- 特征锦囊:彻底了解一下WOE和IV
- Nginx专辑|05 -如何使用Nginx配置正向代理
- 详解 SIGHAN05 的目录结构
- 工业数据分析之数据归一化 | 冰水数据智能专题 | 2nd
- python写的小程序
- 不求甚解之 Spanning Tree
- C语言常用的一些转换工具函数收集
- OpenAI Gym入门级导游 | 附PDF手册下载 | 山人刷强化 | 4th
- python中常见关于Excel表格读写操作
- 2行代码搞定一个定时器!
- python算法题练习---二分法
- 局部加权线性回归 | 冰水数据智能专题 | 3rd
- 一文探讨 RPC 框架中的服务线程隔离