错误信息
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 令牌)之间。
原因
应用程序 ID URI 与客户端 ID
常见当 API 的清单请求 v2.0 令牌时(`requestedAccessTokenVersion: 2`,在旧版清单格式中称为 `accessTokenAcceptedVersion`),Entra ID 会把客户端 ID 放进 `aud`;对于 v1.0 令牌,则放入应用程序 ID URI。只配置了其中一种的 API 会拒绝另一种。
客户端请求的是另一个 API 的令牌
常见请求的范围决定了受众。请求 `User.Read` 的客户端拿到的是 Microsoft Graph 令牌(`aud` = `https://graph.microsoft.com` 或 `00000003-0000-0000-c000-000000000000`),你的 API 必须拒绝这种令牌。
转发 ID 令牌或 Graph 令牌
偶见前端有时会发送 ID 令牌(受众 = 客户端应用)或它们手头已有的 Graph 令牌。这两种令牌都不是给你的 API 用的。
修复方法
- 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.
请求你自己 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();