В моем веб-API на основе ядра Asp.net я хотел бы использовать утверждение jti
(JWT ID) для предотвращения атак воспроизведения при работе с JWT (JSON Web Tokens).
Как и предполагалось, я настроил аутентификацию JWT Bearer:
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
?
UPDATE:
После комментария @ 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-вызова).
Я бы хотел оставить вопрос без ответа, пока не будет найдено какое-либо лучшее решение.