JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

Nuget包:NewLife.Core、NewLife.Secrurity

源码地址:

https://github.com/NewLifeX/X/blob/master/NewLife.Core/Web/JwtBuilder.cs

功能特性

主要功能特性:

  1. Json格式简单易用,JWT目前已经成为最常见的web验证方式;

  2. 主体部分可以按需增加多种数据,满足不同业务场景需要;

  3. 支持多种数字签名方式,HS256/HS384/HS512密钥短小,RS256/RS384/RS512安全性更高;

  4. 支持外扩数字签名方式,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/2NxApJCzGCEDdfSp6VQO30hyhRANCAAQRWz+jn65BtOMvdyHKcvjBeBSDZH2r
1RTwjmYSi9R/zpBnuQ4EiMnCqfMPWiZqB4QdbAd0E7oH50VpuZ1P087G
-----END PRIVATE KEY-----";
var pubKey = @"-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEVs/o5+uQbTjL3chynL4wXgUg2R9
q9UU8I5mEovUf86QZ7kOBIjJwqnzD1omageEHWwHdBO6B+dFabmdT9POxg==
-----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要长一些)。

Web通用令牌JwtBuilder相关推荐

  1. 【开源】微信小程序、小游戏以及 Web 通用 Canvas 渲染引擎 - Cax

    Cax 小程序.小游戏以及 Web 通用 Canvas 渲染引擎 Github → github.com/dntzhang/ca- 综合 DEMO | 运动 DEMO 小程序 DEMO 正在审核中敬请 ...

  2. Web通用型漏洞简介

    本篇文章主要简单介绍一下(我能想到的)Web通用型漏洞(以OWASP体系为主,非组件引起的,可能出现在任何语言任何环境中的web漏洞)的原理以及简单的攻击者利用方式.注:看本篇文章不会学到任何新技术, ...

  3. java web权限框架_Java Web通用用户权限管理框架设计与实现

    2014年第 3期 计 算 机 与 现 代 化 JISUANJI YU XIANDAIHUA 总第 223期 文章编号 :1006-2475(2014)03-0177-03 Java Web通用用户权 ...

  4. html5 2d小游戏,cax: HTML5 Canvas 2D Rendering Engine - 小程序、小游戏以及 Web 通用 Canvas 渲染引擎...

    Cax 小程序.小游戏以及 Web 通用 Canvas 渲染引擎 微信小游戏 特性 Learn Once, Write Anywhere(小程序.小游戏.PC Web.Mobile Web) Writ ...

  5. html集成到小程序1011无标题,GitHub - billee1011/cax: 小程序、小游戏以及 Web 通用 Canvas 渲染引擎...

    Cax 小程序.小游戏以及 Web 通用 Canvas 渲染引擎 小程序 DEMO 正在审核中敬请期待 小游戏 DEMO 正在审核中敬请期待 特性 Learn Once, Write Anywhere ...

  6. 【开源】微信小程序、小游戏以及 Web 通用 Canvas 渲染引擎 - Cax 1

    Cax 小程序.小游戏以及 Web 通用 Canvas 渲染引擎 Github → https://github.com/dntzhang/cax 点我看看 DEMO 小程序 DEMO 正在审核中敬请 ...

  7. WEB通用网关接口:CGI简单教程

    CGI 全称为Common Gateway Interface (通用网关接口),目的是能够让服务器能够方便的调用外部程序. CGI本身是一套协议和规范,原则上只要是拥有读写文件功能的编程语言都可以用 ...

  8. 树状选择框测试用例_【转】【测试用例设计】WEB通用测试用例

    易用性 1.便于使用.理解.并能减少用户发生错误选择的可能性 2.当数据字段过多时,使用便于用户迅速吸取信息的方式表现信息,突出重点信息,标红等方式 3.显示与当前操作相关的信息,给出操作提示. 4. ...

  9. 测试用例设计——WEB通用测试用例(转)

    易用性 1.便于使用.理解.并能减少用户发生错误选择的可能性   2.当数据字段过多时,使用便于用户迅速吸取信息的方式表现信息,突出重点信息,标红等方式   3.显示与当前操作相关的信息,给出操作提示 ...

最新文章

  1. 【算力大放送2】GPU 专属服务器使用教程!!!
  2. 爬虫,关于 video 标签 src 带有blob:http的 一些想法
  3. C++基础08-this指针-const修饰成员函数-函数返回引用/值
  4. pvrect r语言 聚类_技术贴 | R语言——肠型分析:介绍、方法
  5. UNIX 网络编程课程目录
  6. C语言计算圆周率小数后10位,计算圆周率Pi(π)值,精确到小数点后10000位 - 圆周率10000位 - C++ 爱好者...
  7. 1000mx3连电脑没声音_Mac电脑没声音了怎么办?解决Mac上声音问题
  8. Chrome 出现内存 不足
  9. 黑客游戏系列--------第二关
  10. O2O的商业组合模式是什么 O2O怎么来引流?
  11. 高防服务器防御阈值买多大合适呢?
  12. c语言程序电子琴21个音符,儿童电子琴入门《认识附点音符,二分附点音符》
  13. JavaScript基础要点
  14. 02.集线器,网桥,交换机
  15. Drill系列(1):Dremel的原理
  16. 【SMS】SMS协议介绍之SGSN
  17. 微软为什么能转型成功?
  18. 天池大赛--ICPR Text Detection总结
  19. 35.静态链接库和动态链接库
  20. 使用Java语言while循环来实现假如我有一张足够大的纸,他的厚度为0.1毫米 请问折叠多少次,可以折叠到珠峰高度?

热门文章

  1. MySql数据库出现 1396错误
  2. floyd判环算法(龟兔赛跑算法)
  3. 携程编程大赛 (预赛第二场)第一题【剪刀石头布】
  4. SRM 588 D2 L2:GUMIAndSongsDiv2,冷静思考,好的算法简洁明了
  5. 保证一个用户已选取的记录不被其他用户选取
  6. MacBook刷机勘错篇
  7. 电脑pin重置_如果忘记了如何重置Windows PIN
  8. Microsoft Desktop Player是IT Pro的宝贵工具
  9. 搭建 vue2 单元测试环境(karma+mocha+webpack3)
  10. linux下redis安装