Перейти к содержимому
ecdsa.com
Microsoft.IdentityModel.Tokens (.NET).NET

Сообщение об ошибке

IDX10223: Lifetime validation failed. The token is expired.

Также выводится как

  • Bearer error="invalid_token", error_description="The token expired at '10/20/2026 06:28:30'"
  • IDX10222: Lifetime validation failed. The token is not yet valid.

Текст после «The token is expired.» содержит обе метки времени в формате региональных параметров (culture) сервера. Описание в `WWW-Authenticate` в ASP.NET Core формирует `JwtBearerHandler`.

Microsoft.IdentityModel.Tokens (.NET) — SecurityTokenExpiredException

Что это означает

Значение `exp` в токене раньше текущего времени минус `ClockSkew` (по умолчанию 5 минут). Подпись и остальные утверждения могут быть в порядке: просто срок жизни токена истёк. Дальше сообщение продолжается так: «ValidTo (UTC): …, Current time (UTC): …», а ASP.NET Core сообщает клиенту `error_description="The token expired at '…'"`. IDX10222 — противоположный случай: `nbf` находится в будущем.

Почему это происходит

Как исправить

  1. 1.

    Оставьте небольшой допуск на расхождение часов

    Допускайте расхождение в секунды, а не в минуты, и исправьте часы. Никогда не задавайте `ValidateLifetime = false` в рабочей среде.

    csharp
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidIssuer = "https://login.example.com/",
        ValidAudience = "api://orders",
        ClockSkew = TimeSpan.FromSeconds(30), // default is 5 minutes; lower it, do not raise it to hide expiry
    };
  2. 2.

    Получайте токены через библиотеку при каждом вызове

    `AcquireTokenSilent` возвращает действительный токен из кеша или обновляет его, поэтому истечение срока действия обрабатывается ещё до запроса.

    csharp
    // Client side (MSAL): ask for a token every time; MSAL returns the cached one or refreshes it.
    var result = await app.AcquireTokenSilent(scopes, account).ExecuteAsync();
    httpClient.DefaultRequestHeaders.Authorization = new("Bearer", result.AccessToken);

Связанные ошибки

Открыть всю базу ошибок подписей