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
URI de ID de aplicación frente a ID de cliente
frecuenteEntra ID pone el ID de cliente en `aud` cuando el manifiesto de la API solicita tokens v2.0 (`requestedAccessTokenVersion: 2`, que en el formato de manifiesto anterior se llama `accessTokenAcceptedVersion`), y el URI de ID de aplicación en los tokens v1.0. Una API configurada con solo uno de los dos rechaza el otro.
El cliente solicitó un token para otra API
frecuenteLos ámbitos (scopes) deciden la audiencia. Un cliente que pide `User.Read` obtiene un token de Microsoft Graph (`aud` = `https://graph.microsoft.com` o `00000003-0000-0000-c000-000000000000`), que tu API debe rechazar.
Reenvío de un token de ID o de un token de Graph
ocasionalA veces los frontends envían el token de ID (audiencia = la aplicación cliente) o el token de Graph que ya tienen. Ninguno de los dos está destinado a tu API.
Cómo solucionarlo
- 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.
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();