跳到主要内容
ecdsa.com
Microsoft.IdentityModel.Tokens (.NET).NET

错误信息

IDX10214: Audience validation failed.

也可能输出为

  • 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"

8.x 把文本缩短为“IDX10214: Audience validation failed. See https://aka.ms/identitymodel/app-context-switches ”;6.x 和 7.x(在 6.36.0 和 7.7.1 上测试过)会列出令牌的受众和配置的值。ASP.NET Core 会发送 `error_description="The audience '…' is invalid"`。

Microsoft.IdentityModel.Tokens (.NET) — SecurityTokenInvalidAudienceException

含义

令牌的 `aud` 与 `ValidAudience` / `ValidAudiences` 不匹配(如果在 `JwtBearerOptions` 上设置了 `Audience`,则是与该值不匹配)。签名没有问题;令牌是签发给另一个接收方的。在 Microsoft Entra ID 中,典型的不匹配发生在 API 的应用程序 ID URI(`api://…`,用于 v1 令牌)与其客户端 ID GUID(用于 v2 令牌)之间。

原因

修复方法

  1. 1.

    显式列出你的 API 的标识符

    如果两种令牌版本都在使用,就接受你的 API 的客户端 ID 和应用程序 ID URI——除此之外一概不接受。

    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.

    请求你自己 API 的范围

    为 `api://orders/Orders.Read` 签发的令牌以你的 API 为受众。在应用注册中公开一个范围,并让客户端请求它。

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

相关错误

浏览完整的签名错误库