根据jti声明而不是根据到期时间进行JWT重播验证

时间:2018-09-11 17:11:10

标签: c# jwt asp.net-core-2.0

在基于Asp.net Core的Web API中,我想使用jti(JWT ID)声明来防止在处理JWT(JSON Web令牌)时发生重放攻击。

根据建议,我配置了JWT承载身份验证:

services.AddAuthentication(o =>
{
    o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
    o.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateTokenReplay = true,
        IssuerSigningKeyResolver = (token, securityToken, kid, parameters) =>
        {
            // Resolving decryption key
        },
        TokenReplayValidator = (expirationTime, /*string*/ token, validationParameters) =>
        {
            // I can check expiration time, but there is no way to check jti
        },
    };
    o.SaveToken = true;
});

在重播验证器中,我可以访问到期时间,但是无法以某种方式获取jti

我觉得有点混乱。哪个共同点可能有重播攻击和到期时间?

此外,我们还有另一个验证器:

bool LifetimeValidator(DateTime? notBefore, DateTime? expires, 
                       SecurityToken securityToken, 
                       TokenValidationParameters validationParameters);

在这里,我可以访问包括SecurityToken在内的jti数据,但是我不敢相信这是基于jti的重放攻击验证的正确位置。

问题是:如何在SecurityToken内获取TokenReplayValidator数据?

更新:

在@ orhtej2评论之后,我检查了他建议的可能性。确实有效:

TokenReplayValidator = (expirationTime, token, validationParameters) =>
{
    var handler = o.SecurityTokenValidators.OfType<JwtSecurityTokenHandler>().First();
    var securityToken = handler.ReadJwtToken(token);
    var jti = securityToken.Id;
    // check replay attack
},

这是一个解决方案,但是需要额外的令牌解析(这不好-在每个HTTP调用上都需要不必要的计算)。

在找到更好的解决方案之前,我想不回答这个问题。

0 个答案:

没有答案