Как добавить дополнительную проверку для проверки срока службы токена JWT? - PullRequest
0 голосов
/ 18 марта 2019

В моем веб-приложении я хочу выполнить все проверки времени жизни по умолчанию (не раньше, истекает, ...), а также выполнить еще одну проверку (время жизни <2 часа). </p>

Сначала я попробовал это:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, o => {
        o.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateLifetime = true,
            LifetimeValidator = (DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters) => {
                // --> my custom check <--
            }
        };
    });

Это выполнит мою пользовательскую проверку, но пропустит реализацию по умолчанию, поэтому все обычные проверки (не раньше, не истекает, ...) больше не выполняются.

Затем я вызываю реализацию по умолчанию из моего обработчика, например:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, o => {
        o.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateLifetime = true,
            LifetimeValidator = (DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters) => {
                Microsoft.IdentityModel.Tokens.Validators.ValidateLifetime(notBefore, expires, securityToken, validationParameters);
                // --> my custom check <--
            }
        };
    });

Но это будет рекурсивно вызывать мой обработчик и, в конечном итоге, вылетать из приложения.

Так что ... как правильно продлить валидатор времени жизни по умолчанию?

1 Ответ

1 голос
/ 18 марта 2019

Вы можете сделать это:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, o => {
        o.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateLifetime = true,
            LifetimeValidator = (DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters) => {
                var clonedParameters = validationParameters.Clone();
                clonedParameters.LifetimeValidator = null;
                bool valid = Microsoft.IdentityModel.Tokens.Validators.ValidateLifetime(notBefore, expires, securityToken, clonedParameters);
                // --> my custom check <--
            }
        };
    });

Таким образом, мы копируем TokenValidationParameters и устанавливаем ссылку на валидатор времени жизни равной нулю, чтобы он предотвращал рекурсивный вызов и не изменял фактический экземпляр, в котором вы зарегистрировали валидатор.

...