【发布时间】:2020-09-21 20:51:18
【问题描述】:
在我的 aspnet core 3.1 项目中,我使用 CQRS 模式和 JWT 身份验证,我想 当令牌过期时实现自动刷新令牌并不是每次用户都要求输入用户名和密码,我也不想将刷新令牌存储在数据库中。刷新令牌的最佳方法是什么。
我的令牌和刷新令牌的 jwtgenerator 类。
public class JwtGenerator : IJwtGenerator
{
private readonly SymmetricSecurityKey _key;
public JwtGenerator(IConfiguration config)
{
_key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config.GetSection("AppSettings:Token").Value));
}
public string GenerateToken(int size=32)
{
var randomNumber = new byte[size];
using var rng = RandomNumberGenerator.Create();
rng.GetBytes(randomNumber);
return Convert.ToBase64String(randomNumber);
}
public string CreateToken(User user)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.UserName),
new Claim(ClaimTypes.Role, user.Role.ToString("G").ToLower())
};
var creds = new SigningCredentials(_key, SecurityAlgorithms.HmacSha512Signature);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
我的登录方式如下:
public async Task<GetToken> Handle(Query request, CancellationToken
cancellationToken)
{
var user = await _userManager.FindByNameAsync(request.Username);
if (user == null)
throw new UnauhtorizedException("Unauthorized");
var result = await _signInManager.CheckPasswordSignInAsync(user, request.Password,false);
if (result.Succeeded)
{
return new GetToken()
{
Token = _jwtGenerator.CreateToken(user),
RefreshToken = _jwtGenerator.GenerateToken(32)
};
}
throw new UnauhtorizedException("Unauthorized");
}
我的启动配置jwt和认证:
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration.GetSection("AppSettings:Token").Value));
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(opt =>
{
opt.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = key,
ValidateAudience = false,
ValidateIssuer = false
};
});
登录后我得到了正确的结果:
{
"token": "mytoken",
"refreshToken": "tha1qH7PTx4PNoVeD7D7h/BmEZfdS42zWxriexePWlg="
}
附:我没有找到 CQRS 的任何示例。
【问题讨论】:
标签: c# security asp.net-core jwt