C# JWT加密和解密,JWT跨域身份验证

本文介绍了JWT(JSON Web Token)作为跨域身份验证的标准,并展示了使用HMACSHA256进行JWT的加密和解密过程。通过示例代码,详细解释了如何创建包含用户信息的JWT令牌,以及如何解码并验证该令牌,帮助理解JWT在实际应用中的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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":"系统管理员"}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值