Saltar al contenido
ecdsa.com
Microsoft.IdentityModel.Tokens (.NET).NET

Mensaje de error

IDX10214: Audience validation failed.

También se muestra como

  • IDX10214: Audience validation failed. Audiences: 'api://billing'. Did not match: validationParameters.ValidAudience: 'api://orders' or validationParameters.ValidAudiences: 'null'.
  • Bearer error="invalid_token", error_description="The audience 'api://billing' is invalid"

La versión 8.x acorta el texto a «IDX10214: Audience validation failed. See https://aka.ms/identitymodel/app-context-switches »; las versiones 6.x y 7.x (comprobadas con 6.36.0 y 7.7.1) enumeran las audiencias del token y los valores configurados. ASP.NET Core envía `error_description="The audience '…' is invalid"`.

Microsoft.IdentityModel.Tokens (.NET) — SecurityTokenInvalidAudienceException

Qué significa

El `aud` del token no coincide con `ValidAudience` / `ValidAudiences` (o, si `Audience` está establecido en `JwtBearerOptions`, con ese valor). La firma era correcta; el token se emitió para otro destinatario. En Microsoft Entra ID, la discrepancia clásica es entre el URI de ID de aplicación (App ID URI) de la API (`api://…`, usado en los tokens v1) y el GUID de su ID de cliente (usado en los tokens v2).

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Enumerar explícitamente los identificadores de tu API

    Acepta el ID de cliente y el URI de ID de aplicación de tu API si se usan las dos versiones del token, y nada más.

    csharp
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidIssuer = "https://login.microsoftonline.com/<tenant-id>/v2.0",
        // Entra ID v2 tokens carry the client ID; v1 tokens the App ID URI. Accept exactly your API's identifiers.
        ValidAudiences = ["00000000-0000-0000-0000-000000000000", "api://orders"],
    };
  2. 2.

    Solicitar un ámbito de tu API

    Los tokens para `api://orders/Orders.Read` llevan tu API como audiencia. Expón un ámbito en el registro de aplicación y haz que los clientes lo soliciten.

    csharp
    // Client: request a scope of YOUR API, not Microsoft Graph, so aud is your API.
    var result = await app.AcquireTokenSilent(new[] { "api://orders/Orders.Read" }, account).ExecuteAsync();

Errores relacionados

Explorar toda la base de datos de errores de firma