东营网络建设,seo企业网站模板,山西网站建设免费咨询,wordpress影视主题带采集JSON Web Token (JWT)是一个开放标准(RFC 7519)#xff0c;它定义了一种紧凑的、自包含的方式#xff0c;用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任#xff0c;因为它是数字签名的。Nuget包#xff1a;NewLife.Core、NewLife.Secrurity源码地址它定义了一种紧凑的、自包含的方式用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任因为它是数字签名的。Nuget包NewLife.Core、NewLife.Secrurity源码地址https://github.com/NewLifeX/X/blob/master/NewLife.Core/Web/JwtBuilder.cs功能特性主要功能特性Json格式简单易用JWT目前已经成为最常见的web验证方式主体部分可以按需增加多种数据满足不同业务场景需要支持多种数字签名方式HS256/HS384/HS512密钥短小RS256/RS384/RS512安全性更高支持外扩数字签名方式NewLife.Security 支持ES256/ES384/ES512应用场景使用JWT实现的SSO单点登录工作流程用户首先前往SSO用户中心进行身份验证获取JWT令牌即可携带令牌访问各应用服务器。令牌具有有效期一般2小时过期。应用服务器遇到过期令牌时应该拒绝提供服务。SSO用户中心实际上颁发两个令牌访问令牌用于访问各应用服务器刷新令牌用于在令牌过期之前请求SSO刷新令牌。示例详解JwtBuilder设置Secret密钥后默认算法HS256通过Encode编码匿名对象数据得到JWT令牌。解码时只需要设置密钥然后TryDecode即可TryDecode返回JWT令牌验证是否通过如果不通过message输出参数指示错误内容。var builder new JwtBuilder
{IssuedAt 1516239022.ToDateTime(),Expire DateTime.MinValue,Secret Smart,
};var token builder.Encode(new { sub 0201, name stone });
Assert.NotNull(token);
Assert.NotEmpty(token);var ts token.Split(.);
Assert.Equal(3, ts.Length);
Assert.Equal(eyJhbGciOiJIUzI1NiJ9, ts[0]);
Assert.Equal(eyJzdWIiOiIwMjAxIiwibmFtZSI6InN0b25lIiwiaWF0IjoxNTE2MjM5MDIyfQ, ts[1]);
Assert.Equal(mY2_rvQORkyYpK3f84liG2EDpaYY7pO43sRgcli381U, ts[2]);var builder2 new JwtBuilder
{Secret builder.Secret,
};ts builder2.Parse(token);
Assert.NotNull(ts);
Assert.Equal(3, ts.Length);var rs builder2.TryDecode(token, out var msg);
Assert.True(rs);
Assert.Null(msg);Assert.Null(builder2.Type);
Assert.Equal(0201, builder2.Subject);
Assert.Equal(stone, builder2[name]);
ES512扩展HS512安全性不够RS512密钥太长导致令牌也很长。此时最合适使用ES512该算法封装在 NewLife.Security 中引用nuget包后需要注册算法JwtBuilder.RegisterAlgorithm(ES512, ECDsaHelper.SignSha512, ECDsaHelper.VerifySha512)JwtBuilder.RegisterAlgorithm(ES256, ECDsaHelper.SignSha256, ECDsaHelper.VerifySha256);
JwtBuilder.RegisterAlgorithm(ES384, ECDsaHelper.SignSha384, ECDsaHelper.VerifySha384);
JwtBuilder.RegisterAlgorithm(ES512, ECDsaHelper.SignSha512, ECDsaHelper.VerifySha512);var prvKey -----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgevZzL1gdAFr88hb2
OF/2NxApJCzGCEDdfSp6VQO30hyhRANCAAQRWzjn65BtOMvdyHKcvjBeBSDZH2r
1RTwjmYSi9R/zpBnuQ4EiMnCqfMPWiZqB4QdbAd0E7oH50VpuZ1P087G
-----END PRIVATE KEY-----;
var pubKey -----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEVs/o5uQbTjL3chynL4wXgUg2R9
q9UU8I5mEovUf86QZ7kOBIjJwqnzD1omageEHWwHdBO6BdFabmdT9POxg
-----END PUBLIC KEY-----;var builder new JwtBuilder
{Algorithm ES512,Type JWT,IssuedAt 1516239022.ToDateTime(),Expire DateTime.MinValue,Secret prvKey,
};var token builder.Encode(new { sub 1234567890, name NewLife, admin true });
Assert.NotNull(token);
Assert.NotEmpty(token);var ts token.Split(.);
Assert.Equal(3, ts.Length);
Assert.Equal(eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCJ9, ts[0]);
Assert.Equal(eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ik5ld0xpZmUiLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNTE2MjM5MDIyfQ, ts[1]);
//Assert.Equal(xyCWz7tNjH4UUkxi7BqlWE4V857XA6SYC-ZFukvexvIgsGQt9SBcpdglz3NfhhrslOwF7HzWZHOJu3RrIFrDFA, ts[2]);var builder2 new JwtBuilder
{Algorithm ES512,Secret pubKey,
};
var rs builder2.TryDecode(token, out var msg);
Assert.True(rs);
Assert.Null(msg);Assert.Equal(JWT, builder2.Type);
Assert.Equal(1234567890, builder2.Subject);
Assert.Equal(NewLife, builder2[name]);
Assert.True(builder2[admin].ToBoolean());
总结应用自己颁发自己验证使用的场景推荐使用HS512简单安全且令牌长度较短这是最常见的JWT在Web应用场景。应用颁发令牌给多个第三方使用时安全起见不能把HS512密钥给对方此时推荐使用ES512安全性很高并且令牌长度远比RS512要短但比HS512要长一些。