菜单栏

在 .NET Core 中生成和解析JWT令牌(1):基础知识和准备工作

@iEricLee 创建时间 : 2024-09-11 11:02:28 最后修改时间 : 2024-09-11 12:42:56

在 .NET Core 中生成和解析 JWT(JSON Web Tokens)令牌是一个常见的安全实践,用于在客户端和服务器之间安全地传递信息。JWT 可以被用于身份验证和信息交换。本文结合示例演示如何生成JWT令牌,如何校验和解析JWT令牌。

创建控制台项目

为了保持演示项目的简单,使用控制台应用程序:

dotnet new console -n JWTDemo

添加NuGet包

dotnet add System.IdentityModel.Tokens.Jwt

生成JWT令牌

首先需要创建一个 JwtSecurityToken 对象实例,然后调用 JwtSecurityTokenHandler 提供的 WriteToken() 方法来生成令牌。

在创建 JwtSecurityToken 对象实例时,需要设置核心参数:

  • issuer 签发者
  • audience 接收者
  • claims 声明集合
  • notBefore 开始时间
  • expires 有效期
  • signingCredentials 签名凭据

需要注意的是:对于签名凭据,可以根据需要使用不同的签名算法。

签名算法

在 .NET Core 已经提供大多数常用签名算法,例如:

  • SymmetricSecurityKey 对称签名密钥。
  • RsaSecurityKey Rsa签名密钥,是非对称签名密钥。

JWT 最常见的几种签名算法(JWA):HS256(HMAC-SHA256)RS256(RSA-SHA256) 还有 ES256(ECDSA-SHA256)

HS256 使用密钥(一串字符串)生成固定的签名,是一种对称签名算法。这意味着,如果采用 HS256 对 JWT令牌进行签名,必须与任何想要验证 JWT 的客户端或 API 共享密钥。与任何其他对称算法一样,签名和验证 JWT 使用相同的密钥。

RS256非对称算法,生成非对称签名,使用私钥来签名 JWT,并且使用对应的公钥来验证签名。与对称算法不同,使用 RS256 可以保证服务端是 JWT 的签名者,因为服务端是唯一拥有私钥的一方。这样做将不再需要在许多应用程序之间共享私钥。

ES256 和 RS256 一样,都使用私钥签名,公钥验证。算法速度上差距也不大,但是它的签名长度相对短很多(省流量),并且算法强度和 RS256 差不多。对于需要频繁发送的 JWT 而言,更短的长度下来可以节约流量。因此更推荐使用 ES256 算法。

目前应该所有JWT主流库都支持 HS256/RS256/ES256 这三种算法。

接下来,演示使用不同签名算法创建和验证JWT令牌。

  1. 使用 HS256(HMAC-SHA256)算法签名
  2. 使用 RS256(RSA-SHA256)算法签名
  3. 使用 ES256(ECDSA-SHA256)算法签名

参考资料


JWT
在本文档中
Copyright © 2024 知识乐 湘ICP备2022022129号-1