我的应用程序中包含以下代码,以在REST API中生成用于身份验证的JWT:
private string GenerateToken(List<Claim> identityFields)
{
var key = Convert.FromBase64String(__SECRET);
var securityKey = new SymmetricSecurityKey(key);
var descriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(identityFields.ToArray()),
Expires = DateTime.UtcNow.AddDays(1),
SigningCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature)
};
var handler = new JwtSecurityTokenHandler();
var token = handler.CreateJwtSecurityToken(descriptor);
return handler.WriteToken(token);
}
“ identityFields”参数是一个带有用户值的对象(此处不相关)。
我的主要问题是,当我在同一秒内向该方法发送两个请求时(例如,我的意思是,2019-01-23 14:57:59.827和2019-01-23 14:57:59.350) ,它会为两个会话生成相同的JWT(当然,请记住,“ identityFields”是相同的),因为“ Expires”属性与毫秒无关。
如何解决该问题?
我正在使用官方的JWT库(System.IdentityModel.Tokens.Jwt),不是自定义代码。
谢谢!
答案 0 :(得分:0)
我建议看看https://blogs.msdn.microsoft.com/webdev/2016/10/27/bearer-token-authentication-in-asp-net-core/
根据您的特定用例,您应该能够向令牌添加自定义声明,以便您可以直接从令牌中提取所需的信息。
如果您需要保密信息(因为任何人都可以解码JWT令牌),则可以添加一个唯一标识符作为自定义声明,并使用该标识符在数据库中查找信息。