using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;
public class JwtTokenGenerator
{
private readonly string _secretKey;
public JwtTokenGenerator(string secretKey)
{
_secretKey = secretKey;
}
// 生成JWT Token
public string GenerateToken(string username, DateTime expiration)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_secretKey);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, username)
}),
Expires = expiration,
SigningCredentials = new SigningCredentials(
new SymmetricSecurityKey(key),
SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
// 验证JWT Token
public ClaimsPrincipal ValidateToken(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_secretKey);
try
{
tokenHandler.ValidateToken(token, new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
}, out SecurityToken validatedToken);
return tokenHandler.ValidateToken(token, new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
}, out _);
}
catch
{
return null;
}
}
}
JwtTokenGenerator 类:
GenerateToken 方法用于生成一个带有用户名和过期时间的 JWT。ValidateToken 方法用于验证传入的 JWT 是否有效。依赖库:
System.IdentityModel.Tokens.Jwt 和 Microsoft.IdentityModel.Tokens 库来处理 JWT 的生成和验证。密钥管理:
_secretKey 是用于签名和验证 JWT 的密钥,必须在应用程序中妥善保管。Claims:
Claim,表示用户名。可以根据需要添加更多 Claim。验证参数:
ValidateIssuer 和 ValidateAudience 为 false,这意味着我们不关心谁签发了这个 Token 或者它是为谁签发的。根据实际需求可以调整这些参数。希望这段代码和解释对你有帮助!
上一篇:c#获取时间戳
下一篇:c# 获取当前时间戳
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站