using Microsoft.IdentityModel.Tokens; using QYZH.InteractiveMagazine.Models.Settings; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; namespace QYZH.InteractiveMagazine.Infrastructure.Auth; /// /// JWT工具类 /// public static class JwtHelper { /// /// 生成JWT令牌 /// /// 用户ID /// 用户名 /// JWT配置 /// JWT令牌字符串 public static string GenerateToken(long userId, string userName, JwtSettings settings) { var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, userId.ToString()), new Claim(JwtRegisteredClaimNames.Name, userName), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(ClaimTypes.NameIdentifier, userId.ToString()), new Claim(ClaimTypes.Name, userName) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(settings.SecretKey!)); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: settings.Issuer, audience: settings.Audience, claims: claims, expires: DateTime.Now.AddMinutes(settings.ExpiryMinutes), signingCredentials: credentials ); return new JwtSecurityTokenHandler().WriteToken(token); } /// /// 验证JWT令牌 /// /// JWT令牌 /// JWT配置 /// ClaimsPrincipal对象 public static ClaimsPrincipal ValidateToken(string token, JwtSettings settings) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.UTF8.GetBytes(settings.SecretKey!); var validationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = settings.Issuer, ValidateAudience = true, ValidAudience = settings.Audience, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateLifetime = true, ClockSkew = TimeSpan.Zero }; return tokenHandler.ValidateToken(token, validationParameters, out _); } }