Message d’erreur
IDX10223: Lifetime validation failed. The token is expired.
Également affiché sous la forme
- 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.
Le texte qui suit « The token is expired. » contient les deux horodatages au format de la culture du serveur. La description `WWW-Authenticate` d’ASP.NET Core est produite par `JwtBearerHandler`.
Microsoft.IdentityModel.Tokens (.NET) — SecurityTokenExpiredException
Ce que cela signifie
Le claim `exp` du jeton est antérieur à l’heure actuelle moins `ClockSkew` (cinq minutes par défaut). La signature et les autres claims sont peut-être valides ; le jeton a simplement dépassé sa durée de vie. Le message se poursuit par « ValidTo (UTC): …, Current time (UTC): … », et ASP.NET Core renvoie `error_description="The token expired at '…'"` au client. IDX10222 est le cas inverse : `nbf` se situe dans le futur.
Pourquoi cela se produit
La durée de vie du jeton est écoulée
fréquenteLes jetons d’accès Entra ID ont une durée de vie de 60 à 90 minutes par défaut ; chez d’autres fournisseurs, souvent de 5 à 15 minutes. Un client qui continue d’utiliser le même jeton au-delà de `exp` échoue pile à l’heure.
Décalage d’horloge au-delà de la tolérance
occasionnelleAvec un `ClockSkew` réduit (par exemple `TimeSpan.Zero`, un copier-coller courant), même quelques secondes de dérive entre l’émetteur et l’API suffisent à rejeter des jetons tout juste émis.
Un jeton mis en cache en dehors de la bibliothèque de jetons
occasionnelleLes jetons stockés dans une base de données, un champ statique ou un fichier de configuration ne sont jamais renouvelés. MSAL et les bibliothèques similaires les renouvellent automatiquement si vous les laissez faire.
Comment corriger l’erreur
- 1.
Garder une faible tolérance de décalage d’horloge
Tolérez une dérive de quelques secondes, pas de quelques minutes, et corrigez les horloges. Ne définissez jamais `ValidateLifetime = false` en production.
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.
Obtenir les jetons via la bibliothèque à chaque appel
`AcquireTokenSilent` renvoie un jeton valide depuis le cache ou le renouvelle : l’expiration est ainsi gérée avant la requête.
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);