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 также зарегистрируется у пользователя.
Более подробно о многоуровневых приложениях смотрите в документе ниже: