Сообщение об ошибке
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 классическое несовпадение — между App ID URI этого API (`api://…`, используется в токенах v1) и GUID его идентификатора клиента (используется в токенах v2).
Почему это происходит
Путаница App ID URI и идентификатора клиента
частоEntra ID помещает в `aud` идентификатор клиента, если манифест API запрашивает токены v2.0 (`requestedAccessTokenVersion: 2`, в старом формате манифеста — `accessTokenAcceptedVersion`), и App ID URI — для токенов v1.0. API, в котором настроено только одно из двух значений, отклоняет токены с другим.
Клиент запросил токен для другого API
частоАудиторию определяют области доступа. Клиент, запросивший `User.Read`, получает токен Microsoft Graph (`aud` = `https://graph.microsoft.com` или `00000003-0000-0000-c000-000000000000`), который ваш API обязан отклонить.
Пересылка ID-токена или токена Graph
иногдаФронтенды иногда отправляют ID-токен (аудитория = клиентское приложение) или уже имеющийся у них токен Graph. Ни один из них не предназначен для вашего API.
Как исправить
- 1.
Явно перечислите идентификаторы вашего API
Принимайте идентификатор клиента и App ID URI вашего API, если используются обе версии токенов, — и больше ничего.
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();