一、JWT简介
JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),
该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,该token也可直接被用于认证,也可被加密。
二、引用JWT解析的程序集
三、使用JWT加密、解密
1.JWT加密代码
//JWT载荷数据对象
var payload = new Dictionary<string, object>
{
//发行人
{ "iss","剁椒鱼头"},
//到期时间【设置过期时间为24小时】
{ "exp", DateTimeOffset.UtcNow.AddHours(24).ToUnixTimeSeconds() },
//主题
{ "sub", "TestJWT" },
//用户
{ "aud", "USER" },
//发布时间
{ "iat", DateTimeOffset.UtcNow.ToUnixTimeSeconds()},
//自定义载荷数据
{
"data", new
{
UserId = 123456,
UserName = "系统管理员"
}
}
};
//私钥
var secret = "C4CCD2D2656D820062C11968C09E9175";
//HMACSHA256加密
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
//序列化和反序列
IJsonSerializer serializer = new JsonNetSerializer();
//Base64编解码
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
//编码成JWT令牌
var token = encoder.Encode(payload, secret);
Console.WriteLine(token);
加密结果
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiLliYHmpJLpsbzlpLQiLCJleHAiOjE2NTQ3MDEzNjYsInN1YiI6IlRlc3RKV1QiLCJhdWQiOiJVU0VSIiwiaWF0IjoxNjU0NjE0OTY2LCJkYXRhIjp7IlVzZXJJZCI6MTIzNDU2LCJVc2VyTmFtZSI6Iuezu-e7n-euoeeQhuWRmCJ9fQ.4dXaUCvcnIg4GE1z2rzPFx5pgoHFpBeZ_LOFXgH-qH0
使用工具 http://www.lzltool.com/jwt-decode 可以在线预览JWT内容
2.使用JWT解密
//私钥
var secret = "C4CCD2D2656D820062C11968C09E9175";
//需要解密的JWT令牌
var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiLliYHmpJLpsbzlpLQiLCJleHAiOjE2NTQ3MDEzNjYsInN1YiI6IlRlc3RKV1QiLCJhdWQiOiJVU0VSIiwiaWF0IjoxNjU0NjE0OTY2LCJkYXRhIjp7IlVzZXJJZCI6MTIzNDU2LCJVc2VyTmFtZSI6Iuezu-e7n-euoeeQhuWRmCJ9fQ.4dXaUCvcnIg4GE1z2rzPFx5pgoHFpBeZ_LOFXgH-qH0";
try
{
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJsonSerializer serializer = new JsonNetSerializer();
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);
var json = decoder.Decode(token, secret, verify: true);
Console.WriteLine(json);
}
catch (TokenExpiredException)
{
Console.WriteLine("Token 已经过期!");
}
catch (SignatureVerificationException)
{
Console.WriteLine("签名校验失败,数据可能被篡改!");
}
解密结果
{"iss":"剁椒鱼头","exp":1654701366,"sub":"TestJWT","aud":"USER","iat":1654614966,"data":{"UserId":123456,"UserName":"系统管理员"}}