当提供相同的Expires时,为什么IdentityModel JWT库生成相同的令牌?

时间:2019-01-23 15:24:54

标签: c# rest api asp.net-web-api jwt

我的应用程序中包含以下代码,以在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),不是自定义代码。

谢谢!

1 个答案:

答案 0 :(得分:0)

我建议看看https://blogs.msdn.microsoft.com/webdev/2016/10/27/bearer-token-authentication-in-asp-net-core/

根据您的特定用例,您应该能够向令牌添加自定义声明,以便您可以直接从令牌中提取所需的信息。

如果您需要保密信息(因为任何人都可以解码JWT令牌),则可以添加一个唯一标识符作为自定义声明,并使用该标识符在数据库中查找信息。