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
Die Lebensdauer des Tokens ist abgelaufen
häufigAccess Tokens von Entra ID sind standardmäßig 60–90 Minuten gültig, die anderer Anbieter oft 5–15 Minuten. Ein Client, der dasselbe Token über `exp` hinaus weiterverwendet, scheitert auf die Minute genau.
Uhrenabweichung jenseits der Toleranz
gelegentlichMit einem verkleinerten `ClockSkew` (etwa `TimeSpan.Zero`, oft per Copy-and-paste übernommen) führen schon Sekunden Abweichung zwischen Aussteller und API dazu, dass frische Tokens abgelehnt werden.
Ein Token, das außerhalb der Token-Bibliothek zwischengespeichert wird
gelegentlichTokens, die in einer Datenbank, einem statischen Feld oder einer Konfigurationsdatei liegen, werden nie erneuert. MSAL und ähnliche Bibliotheken erneuern sie automatisch, wenn du sie lässt.
So behebst du den Fehler
- 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.
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);