RsCode.AspNetCore
提供JwtHelper
工具类,可帮助生成jwt token
,有两种加密方式的实现:对称加密和非对称加密
对称加密使用RS256
,非对称加密使用HS256
密钥生成
使用非对称加密时,SecurityKey最少需要32位以上,随意填写内容
对称加密密钥生成方式:
通过第三方生成
打开网站https://mkjwk.org/ 生成
示例:
手动生成
bash
# 生成私钥
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# 从私钥导出公钥
openssl rsa -pubout -in private_key.pem -out public_key.pem
jwt认证
1.在appsettings.json文件中配置jwt
json
{
"Jwt": {
"Issuer": "https://rscode.cn",
"Audience": "rscode.cn",
"SecurityKey": "12343543DFSSDAFDFI2xxxxxxxxxx",
"PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiGUwIDAQAB\n-----END PUBLIC KEY-----\n", //公钥
"PublicKeyPath": "", //公钥文件路径
"PrivateKey": "-----BEGIN PRIVATE KEY-----JVw==\n-----END PRIVATE KEY-----\n", //私钥
"PrivateKeyPath":"",//private pem文件路径
//accesstoken过期时间,单位(分钟)
"Expire": 15
}
}
2.认证服务器
非对称加密的jwt
设置 SecurityKey 32位以上
appsettings.json文件中配置key SecurityKey
csharp
List<Claim> claims = new List<Claim>();
claims.Add(new Claim("UserId", "1ef62d58d8ce485c96724f71bdd817d6"));
claims.Add(new Claim("UserName", "215996632064"));
claims.Add(new Claim("Role", "1"));
//创建token
var token=JwtHelper.CreateToken(claims, 60);
对称加密的jwt
使用PrivateKey创建JWT Token
appsettings.json文件中配置好私钥 PrivateKey
或PrivateKeyPath
csharp
List<Claim> claims = new List<Claim>();
claims.Add(new Claim("UserId", "1ef62d58d8ce485c96724f71bdd817d6"));
claims.Add(new Claim("UserName", "215996632064"));
claims.Add(new Claim("Role", "1"));
var token=JwtHelper.CreateJwtToken(claims, 60);
3.业务服务器使用公钥验证 appsettings.json文件中配置公钥或SecurityKey
csharp
public static void CustomJwt(this IServiceCollection services, string Url = "/UserAuthHub")
{
//使用对称加密的 jwt服务
RsCode.AspNetCore.JwtExtensions.AddJwtBearer(services);
//使用非对称加密的jwt服务
//RsCode.AspNetCore.JwtExtensions.AddJwt(services);
//其它
services.AddAuthorization(options =>
{
options.AddPolicy("admin", policy => policy.Requirements.Add(new AdminRequirement("admin")));
options.AddPolicy("vip", policy => policy.Requirements.Add(new AdminRequirement("vip")));
});
services.AddSingleton<IAuthorizationHandler, AdminRequirementHandler>();
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
自定义授权请求类
csharp
public class SellerRequirement : IAuthorizationRequirement
{ }
public class SellerRequirementHandler : AuthorizationHandler<SellerRequirement>
{
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, SellerRequirement requirement)
{
if (context.User.Claims.Count() > 0)
{
var shopId = context.User.Claims.FirstOrDefault(c => c.Type == "ShopId")?.Value;
if (string.IsNullOrWhiteSpace(shopId))
{
context.Fail();
}
else
{
context.Succeed(requirement);
}
}
}
}
调用
需要授权的地方,添加[Authorize]
或[Authorize("admin")]