tentrun
@tentrun
Clown c# inside

В чем проблема при валидации JWT токена?

Использую JWTBearer. Пытаюсь валидировать токен с клиента
Код валидатора
private bool ValidateToken(string? _authToken)
        {
            var tokenHandler = new JwtSecurityTokenHandler();
            var validationParameters = GetValidationParameters();

            SecurityToken validatedToken;
            if (_authToken != null)
            { 
                IPrincipal principal = tokenHandler.ValidateToken(_authToken, validationParameters, out validatedToken);
            }
            return true;
        }


ValidationParameters
Параметры валидации
RequireExpirationTime = true,
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidAudience = _configuration["JWT:ValidAudience"],
                ValidIssuer = _configuration["JWT:ValidIssuer"],
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:SecretKey"])),
                ClockSkew = TimeSpan.Zero


Делаю запрос постменом, если токен валидный, то он пропускает и все хорошо.
Но, если токен не существует или просрочен он падает в исключение
IDX10223: Lifetime validation failed. The token is expired. ValidTo: 'System.DateTime', Current time: 'System.DateTime'.

Видел что создавали issue на гитхабе, но это было давно и вроде как они закрыты. Так же писали о синхронизации времени на сервере и клиенте (пробовал). Информации по этому не особо нашел.
В чем проблема? Просто ловить и обрабатывать исключение?
  • Вопрос задан
  • 550 просмотров
Решения вопроса 1
tentrun
@tentrun Автор вопроса
Clown c# inside
Решил проблему.
Необходимо было установить явное DateTime.UtcNow в LifeTimeValidator.
Может кому-то поможет.

LifeTimeValidator
LifetimeValidator lifetimeValidator = (DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters) =>
            {
                if (expires != null && notBefore != null)
                {
                    if (DateTime.UtcNow < expires.Value.ToUniversalTime() & DateTime.UtcNow > notBefore.Value.ToUniversalTime())
                    {
                        return true; // Still valid
                    }
                }
                return false; // Expired
            };


Валидация
if (_authToken != null & tokenHandler.CanReadToken(_authToken) & _authToken?.Length == 348)
            {
                var jwtSecurityToken = tokenHandler.ReadJwtToken(_authToken);
                SecurityToken validatedToken;
                IPrincipal principal = tokenHandler.ValidateToken(_authToken, GetValidationParameters(), out validatedToken);

                if (lifetimeValidator(validatedToken.ValidFrom, validatedToken.ValidTo, jwtSecurityToken, GetValidationParameters()))
                {
                    if(principal?.Identity?.Name != null)
                    {
                        return true; // Token is valid
                    }
                }
                else
                {
                    return false; // Token is expired
                }
            }
            return false; // Token is damaged
        }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@TIMOHIUS
QA automation
Попробуйте вывести у себя оба параметра ValidTo и Current time, возможно разница в часовом поясе или что то вроде того. Вообщем недостаточно данных чтобы понять)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы