Проверка воспроизведения JWT основана на заявлении jti, а не на сроке действия - PullRequest
0 голосов
/ 11 сентября 2018

В моем веб-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-вызова).

Я бы хотел оставить вопрос без ответа, пока не будет найдено какое-либо лучшее решение.

...