Pular para o conteúdo
ecdsa.com
Microsoft.IdentityModel.Tokens (.NET).NET

Mensagem de erro

IDX10214: Audience validation failed.

Também aparece 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"

A versão 8.x encurta o texto para “IDX10214: Audience validation failed. See https://aka.ms/identitymodel/app-context-switches ”; as versões 6.x e 7.x (verificadas na 6.36.0 e na 7.7.1) listam os públicos-alvo do token e os valores configurados. O ASP.NET Core envia `error_description="The audience '…' is invalid"`.

Microsoft.IdentityModel.Tokens (.NET) — SecurityTokenInvalidAudienceException

O que significa

O `aud` do token não corresponde a `ValidAudience` / `ValidAudiences` (ou, com `Audience` definido em `JwtBearerOptions`, a esse valor). A assinatura estava correta; o token foi emitido para outro destinatário. No Microsoft Entra ID, a divergência clássica é entre o App ID URI da API (`api://…`, usado em tokens v1) e o GUID do ID do cliente dela (usado em tokens v2).

Por que acontece

Como corrigir

  1. 1.

    Listar explicitamente os identificadores da sua API

    Aceite o ID do cliente e o App ID URI da sua API, se as duas versões de token estiverem em uso — e nada mais.

    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 um escopo da sua API

    Tokens para `api://orders/Orders.Read` trazem sua API como público-alvo. Exponha um escopo no registro de aplicativo e faça os clientes solicitarem esse escopo.

    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();

Erros relacionados

Ver toda a base de erros de assinatura