66 lines
2.3 KiB
C#
66 lines
2.3 KiB
C#
|
|
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取签名
|
|
/// </summary>
|
|
/// <param name="appSecret"></param>
|
|
/// <param name="path"></param>
|
|
/// <param name="timestamp"></param>
|
|
/// <param name="token"></param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
}
|
|
}
|