Aller au contenu
ecdsa.com
Microsoft.IdentityModel.Tokens (.NET).NET

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

Comment corriger l’erreur

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

Erreurs associées

Parcourir toute la base de données des erreurs de signature