namespace ZhiYi.Core.Application.Middleware
{
public class TokenService
{
private readonly IConfiguration _configuration;
private readonly IDatabase _redis;
public TokenService(IConfiguration configuration, IConnectionMultiplexer redis)
{
_configuration = configuration;
_redis = redis.GetDatabase();
}
public string GenerateTokenAsync(long userid, string username)
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
var expiryInMinutes = int.Parse(_configuration["Jwt:ExpiryInMinutes"]);
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _configuration["Jwt:Issuer"],
audience: _configuration["Jwt:Audience"],
expires: DateTime.Now.AddMinutes(expiryInMinutes),
claims: new[]
{
new Claim(ClaimTypes.Name, username), // 设置用户名
new Claim(ClaimTypes.Sid, userid.ToString()) //用户ID
},
signingCredentials: credentials
);
var tokenString = new JwtSecurityTokenHandler().WriteToken(token);
// 将 Token 存储到 Redis 有效时间30分钟
_redis.StringSet($"token:{userid}", tokenString, TimeSpan.FromMinutes(30));
return tokenString;
}
///
/// 获取签名
///
///
///
///
///
///
public string GenerateSignature(string appSecret, string path, string timestamp, string token)
{
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(appSecret));
var data = $"{path.ToLower()}|{timestamp}|{token}";
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(data));
return Convert.ToBase64String(hash);
}
public bool ValidateToken(string userid, string token)
{
var storedToken = _redis.StringGet($"token:{userid}");
return storedToken == token;
}
}
}