jwt token 过期刷新_.net core 3.1 Jwt操作封装类,JwtHelper,支持生成、刷新等
时间: 2023-12-03 11:42:20 浏览: 286
.net core 3.1 jwt刷新token
5星 · 资源好评率100%
在使用 JWT 进行身份验证时,通常会设置一个过期时间,以确保用户在一段时间内保持登录状态。当 JWT 过期时,用户需要重新登录并获取新的 JWT 令牌。为了避免用户频繁重新登录,我们可以使用刷新令牌的方式来延长用户的登录状态。
在 .NET Core 3.1 中,我们可以使用 JwtSecurityTokenHandler 类来生成和验证 JWT 令牌。下面是一个简单的 JwtHelper 类的实现,它支持生成、刷新和验证 JWT 令牌:
```csharp
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
public class JwtHelper
{
private static readonly string secret = "your_secret_key_here";
private static readonly string issuer = "your_issuer_here";
private static readonly int expireMinutes = 30;
private static readonly int refreshExpireMinutes = 60;
public static string GenerateToken(string userId)
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(ClaimTypes.NameIdentifier, userId)
};
var tokenDescriptor = new SecurityTokenDescriptor
{
Issuer = issuer,
Audience = issuer,
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddMinutes(expireMinutes),
SigningCredentials = credentials
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
public static string RefreshToken(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
try
{
var claimsPrincipal = tokenHandler.ValidateToken(token, new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidIssuer = issuer,
ValidAudience = issuer,
IssuerSigningKey = securityKey,
ValidateLifetime = false
}, out SecurityToken validatedToken);
var jwtToken = validatedToken as JwtSecurityToken;
if (jwtToken == null || !jwtToken.Header.Alg.Equals(SecurityAlgorithms.HmacSha256, StringComparison.InvariantCultureIgnoreCase))
{
throw new SecurityTokenException("Invalid token");
}
var userId = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier).Value;
return GenerateToken(userId);
}
catch(Exception ex)
{
throw new SecurityTokenException("Invalid token", ex);
}
}
public static bool ValidateToken(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
try
{
var claimsPrincipal = tokenHandler.ValidateToken(token, new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidIssuer = issuer,
ValidAudience = issuer,
IssuerSigningKey = securityKey,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
}, out SecurityToken validatedToken);
var jwtToken = validatedToken as JwtSecurityToken;
if (jwtToken == null || !jwtToken.Header.Alg.Equals(SecurityAlgorithms.HmacSha256, StringComparison.InvariantCultureIgnoreCase))
{
throw new SecurityTokenException("Invalid token");
}
return true;
}
catch(Exception)
{
return false;
}
}
}
```
在上面的代码中,我们定义了一个静态的 secret 字符串来存储 JWT 的密钥,一个 issuer 字符串来存储 JWT 的发行者,以及一个 expireMinutes 和 refreshExpireMinutes 来分别设置 JWT 令牌和刷新令牌的过期时间。在 GenerateToken 方法中,我们使用 JwtSecurityTokenHandler 类来创建一个 JWT 令牌,并设置其过期时间和签名凭证。在 RefreshToken 方法中,我们首先验证传入的 JWT 令牌是否有效,并提取其中的用户 ID。然后,我们使用 GenerateToken 方法来生成一个新的 JWT 令牌。在 ValidateToken 方法中,我们验证传入的 JWT 令牌是否有效,并返回一个布尔值表示验证结果。
使用 JwtHelper 类非常简单,只需要调用其中的 GenerateToken、RefreshToken 和 ValidateToken 方法即可。下面是一个示例:
```csharp
var token = JwtHelper.GenerateToken("user_id");
var isValid = JwtHelper.ValidateToken(token);
var refreshedToken = JwtHelper.RefreshToken(token);
```
需要注意的是,由于 JWT 令牌是无状态的,因此在刷新令牌时,我们需要使用一些外部存储机制(如数据库或缓存)来存储每个用户的刷新令牌。当用户请求刷新令牌时,我们可以从外部存储中检索出用户的刷新令牌,并验证其有效性后生成新的 JWT 令牌。
阅读全文