Перейти к содержимому
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 классическое несовпадение — между App ID URI этого API (`api://…`, используется в токенах v1) и GUID его идентификатора клиента (используется в токенах v2).

Почему это происходит

Как исправить

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

Связанные ошибки

Открыть всю базу ошибок подписей