#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, у вас могут возникнуть некоторые непреднамеренные проблемы.