AADSTS50013: Заявка на аудиторию утверждений не соответствует требуемому значению

У меня есть одностраничное приложение, которое аутентифицирует пользователей в Azure, используя adal-angular.js/adal.js [клиент].
Возвращенный токен вставляется в заголовок auth и передается на веб-API [сервер]. Этот веб-интерфейс генерирует новый токен доступа для приложения, используя рабочий процесс от имени ( https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof). Этот токен затем используется для вызова нисходящий API [API1]. Поэтому последующий API повторяет этот процесс, чтобы получить новый токен для вызова другого API [API2]. Именно в этот момент я получаю вышеуказанную ошибку.

Значение aud в токене, передаваемом от [client] на [server], является идентификатором приложения [server] app. Значение aud в токене, передаваемом с [server] на [API1], является URI приложения приложения [API1]. Все идет нормально.

Когда я вызываю AcquireTokenAsync в приложении [API1], я получаю следующую ошибку:

AADSTS70002: Ошибка при проверке учетных данных.AADSTS50013: Заявка на аудиторию утверждений не соответствует требуемому значению.Аудитория в утверждении была "http: //application_uri.com /", а ожидаемая аудитория - "snip -a1d5-e82e84f4e19e" или один из Uris приложения этого приложения с идентификатором приложения "snip -a1d5-e82e84f4e19e".

Соответствующий код из [API1]:

public static async Task<string> GetApplicationTokenOnBehalfOfUser(string appId, string appKey)
    {
        var clientCredential = new ClientCredential(appId, appKey);
        var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as
                System.IdentityModel.Tokens.BootstrapContext;
        var userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;
        var userAccessToken = bootstrapContext.Token;
        var userAssertion = new UserAssertion(userAccessToken, _assertionType, userName);
        var authority = string.Format(System.Globalization.CultureInfo.InvariantCulture, _aadInstance, _tenant);

        var userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
        var authContext = new AuthenticationContext(authority, new TokenCache());

        var result = await authContext.AcquireTokenAsync(_resourceId, clientCredential, userAssertion);
        var accessToken = result.AccessToken;
        return accessToken;
    }

Где: appId = "snip -a1d5-e82e84f4e19e"

И значение "aud" из BootstrapContext.Token: "aud": "http: //application_uri.com /"

Если я изменю вышеприведенное, чтобы использовать значение "aud" из токена в качестве appId в ClientCredential, я получаю эту ошибку вместо этого:

AADSTS65001: Пользователь или администратор не дал согласие на использование приложения с идентификатором "http: //application_uri.com /".Отправьте интерактивный запрос авторизации для этого пользователя и ресурса.

Я делаю это правильно? Благодарю.

2 ответа

Решение

Чтобы это работало, мне пришлось добавить следующие делегированные разрешения в API1 для AP2. Разрешения Azure

AADSTS70002: Ошибка при проверке учетных данных. AADSTS50013: Заявка на аудиторию утверждений не соответствует требуемому значению. Аудитория в утверждении была " http://application_uri.com/ ", а ожидаемая аудитория - "snip-a1d5-e82e84f4e19e" или один из Uris приложения этого приложения с идентификатором приложения "snip-a1d5-e82e84f4e19e".

Чтобы использовать поток "от имени", нам нужно предоставить токен доступа для API1 и предоставить clientId и правильный API1 для запроса токена доступа для API2.

AADSTS65001: Пользователь или администратор не дал согласие на использование приложения с идентификатором " http://application_uri.com/ ". Отправьте интерактивный запрос авторизации для этого пользователя и ресурса.

Прежде чем пользователи-арендаторы смогут использовать приложение, соответствующий участник службы должен сначала зарегистрироваться на этом арендаторе путем предоставления разрешения. Разве API2 не входит в учетную запись пользователя?

Если я правильно понимаю, нам нужно указать knownClientApplications в манифесте API1 ( http://application_uri.com/ ') с client_id вашего SPA, а также требуется установить разрешение API1 для SPA. После этого, когда пользователи войдут в ваш SPA, приложение API1 также зарегистрируется у пользователя.

Более подробно о многоуровневых приложениях смотрите в документе ниже:

Как войти в систему любого пользователя Azure Active Directory (AD) с использованием шаблона мультитенантного приложения

Обновить (добавить результаты теста, чтобы объяснить)

Другие вопросы по тегам