在基于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调用上都需要不必要的计算)。
在找到更好的解决方案之前,我想不回答这个问题。