Zum Inhalt springen
ecdsa.com
Microsoft.IdentityModel.Tokens (.NET).NET

Fehlermeldung

IDX10223: Lifetime validation failed. The token is expired.

Auch ausgegeben als

  • 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.

Der Text nach „The token is expired.“ enthält beide Zeitstempel im Kulturformat des Servers. Die Beschreibung, die ASP.NET Core in `WWW-Authenticate` sendet, erzeugt `JwtBearerHandler`.

Microsoft.IdentityModel.Tokens (.NET) — SecurityTokenExpiredException

Was der Fehler bedeutet

Der Claim `exp` des Tokens liegt vor der aktuellen Zeit minus `ClockSkew` (standardmäßig fünf Minuten). Die Signatur und die übrigen Claims können gültig sein; das Token hat schlicht seine Lebensdauer überschritten. Die Meldung geht mit „ValidTo (UTC): …, Current time (UTC): …“ weiter, und ASP.NET Core meldet dem Client `error_description="The token expired at '…'"`. IDX10222 ist der umgekehrte Fall: `nbf` liegt in der Zukunft.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Kleine Toleranz für Uhrenabweichungen beibehalten

    Toleriere Abweichungen von Sekunden, nicht von Minuten, und korrigiere die Uhren. Setze in Produktion niemals `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.

    Tokens bei jedem Aufruf über die Bibliothek beziehen

    `AcquireTokenSilent` liefert ein gültiges Token aus dem Cache oder erneuert es, sodass der Ablauf schon vor der Anfrage behandelt wird.

    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);

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen