@iEricLee Creation Time : 2024-09-11 11:02:28 Last Modification Time : 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
首先需要创建一个 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令牌。