обработчик.CreateJwtSecurityToken(дескриптор); IDX12401

#timezone #jwt-auth #expired-cookies

#Часовой пояс #jwt #срок действия файлов cookie истек

Вопрос:

Когда мой сервер работает локально (GTM 1), все в порядке, когда я размещаю свой сервер в часовом поясе -8, например

Затем я получаю сообщение:

 IDX12401: Expires: '[PII is hidden by default. Set the 'ShowPII' flag in IdentityModelEventSource.cs to true to reveal it.]' must be after NotBefore: '[PII is hidden by default. Set the 'ShowPII' flag in IdentityModelEventSource.cs to true to reveal it.]'.
  

Похоже, это потому, что

 Expires = DateTime.Now.AddMinutes(30),

... other code ...

JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
JwtSecurityToken token = handler.CreateJwtSecurityToken(descriptor);
  

Выдает ошибку. Странно то, что поле Expires — это текущее время в этой зоне 30 минут (это то, что настроено 30 минут). Это странно. Почему он не разрешает вход в систему и немедленно истекает с этим сообщением, но только в часовом поясе a -X, в то время как показанное время на самом деле составляет 30 минут в будущем.

Комментарии:

1. В ошибке не указано, что срок его действия истек, но «Истекает: должно быть после NotBefore». Обычно nbf совпадает с iat (выдается в), время создания. Может ли быть так, что nbf вычисляется с другим часовым поясом, отличным от exp, что приводит к временной метке unix (на основе UTC), которая имеет более раннее время для exp, чем для nbf?

2. Я решил это, изменив дату и время. Теперь перейдем к дате и времени. UtcNow везде.

3. Это тоже исправило мою ошибку. Спасибо!

Ответ №1:

Ошибка не ясно, что именно должно быть сделано, но если вы будете искать достаточно долго, вы можете обнаружить, что есть еще один атрибут с именем «NotBefore», ошибка говорит об этом свойстве.

Как вы можете видеть в документации, оба свойства «NotBefore» и «Expires» должны быть в UTC, поэтому, как вы уже догадались, для проверки используется дата и время.UtcNow. Поэтому, если вы живете в стране с отрицательным часовым поясом, вы должны столкнуться с этой проблемой.

Решение довольно простое:

 var date = DateTime.UtcNow;
var tokenDescriptor = new SecurityTokenDescriptor
{
    Expires = date.AddMinutes(10),
    NotBefore = date,
};
  

Кроме того, важно отметить, что свойство «NotBefore» будет преобразовано в поле «nbf» (недопустимое ранее), следовательно, если вы вставите значение выше UtcNow, у вас могут возникнуть некоторые непреднамеренные проблемы.