Как использовать приложение API Azure REST с включенной авторизацией Azure Active Directory
Я развернул API App
в Azure, но у меня возникают проблемы при создании API-клиента, если для параметра Аутентификация (с AAD) установлено значение ON.
Когда я пытаюсь сгенерировать сервисный клиент (когда Аутентификация выключена), тогда генерируется код клиента (это делается с помощью Autorest), и код работает, но когда я включаю Аутентификацию (и Действие, которое нужно выполнить, когда запрос не аутентифицирован, устанавливается на Login with Azure Active Directory
), затем
1) возвращен сервисный звонок 401 Unauthorized
(без перенаправления на страницу входа AAD)
2) Затем я попытался еще раз сгенерировать служебный клиент (из контекстного меню Проекта -> Добавить -> Клиент REST API -> затем в диалоговом окне я выбрал "Выбрать актив Azure", нажал "ОК" и получил сообщение. "Failed to download metadata file for Microsoft Azure API App: ...app name..."
(и "нет дополнительной информации")
Я выполнял AAD в соответствии с этим руководством по Azure (используя экспресс-настройки):
Работал в соответствии с этим видео тоже, и все, что показано в этом видео, работало, за исключением того, что AAD не был продемонстрирован... и для меня это не работает...
Какие-либо предложения?
РЕДАКТИРОВАТЬ
1) Если я ввожу URL-адрес запроса (который использует клиент REST API) в веб-браузере - он возвращает действительные результаты. 2) Я обнаружил, что использую REST API без учетных данных (я думал, что в этом случае должен быть представлен экран входа в Azure AD).... но это не так)
РЕДАКТИРОВАТЬ 2
Я получил некоторый прогресс - попал на экран входа в AAD, но после ввода учетных данных я получаю bearer token
, но когда я пытаюсь запросить службу, я получаю сообщение об ошибке:
AADSTS65005: The client application has requested access to resource 'https....azurewebsites.net'. This request has failed because the client has not specified this resource in its requiredResourceAccess list.
Trace ID: 4176e...
Correlation ID: 1d612d...
Timestamp: 2016-11-13 18:28:34Z
Вот шаги, которые я сделал, чтобы получить это далеко:
0) Добавлен пакет nuget для Microsoft.IdentityModel.Clients.ActiveDirectory в клиентский проект.
1) зарегистрировал мое клиентское приложение в Azure Active Directory
2) при вызове REST API из клиентского приложения добавляю ServiceClientCredentials
3) при создании ServiceClientCredentials я предоставляю 4 элемента: -authority = это из регистраций приложения AAD -> Конечные точки => Документ метаданных федерации vērtība (без начальной части http://login.windows.net/
)
-resource => это URI API REST (=> идентификатор целевого ресурса, который является получателем запрошенного токена)
-clientId => это идентификатор приложения, который я получаю после регистрации клиентского приложения в AAD -redirect Uri =>, поскольку мое клиентское приложение является собственным приложением, то это просто любой действительный URL
Как я могу указать этот ресурс в моем клиентском приложении?
client has not specified this resource in its requiredResourceAccess list
1 ответ
Мне удалось найти решение о том, как включить авторизацию AAD в приложении Azure REST API. На всякий случай, если у кого-то возникнет такая же проблема, я надеюсь, что это будет полезно.
Вот шаги, которые я сделал:
1) В сервисах приложения -> Аутентификация / авторизация
- Аутентификация службы приложений => Вкл.
- Действие, которое необходимо выполнить, если запрос не прошел проверку подлинности => Войти с помощью AAD
- Настроил AAD с настройками Express (там вы должны создать приложение Azure AD для своего приложения API - т.е. "Регистрация приложения" для своей службы)
2) В Azure Active Directory -> регистрации приложений
- Добавить регистрацию для вашего клиентского приложения
- Изменить манифест вашего клиентского приложения - в
requiredResourceAccess
В разделе необходимо добавить информацию о REST API App:resourceAppId
-> вставьте здесь идентификатор приложения REST APIresourceAccess {id}
-> Значение идентификатора OauthPermission для REST API (вы можете получить его в манифесте REST API!)
3) В вашем клиентском приложении
- сгенерируйте свой REST-клиент, используя
Autorest
(из обозревателя решений:Add\REST API client
) или создайте его вручную - добавлять
Microsoft.IdentityModel.Clients.ActiveDirectory
Nuget Pack получить и использовать токен для доступа к вашему API с кодом, подобным следующему:
//request (..) var tokenCreds = getToken(); ServiceClientCredentials credentials = tokenCreds; using (var client = new YourAPI(credentials)) { ... } (..) //getting token private static TokenCredentials getToken() { //get this from Federation Metadata Document in //Azure Active Directory App registrations -> Endpoints var authority = "f1..."; //Identifier of the target resource that is the recipient of the requested token var resource = "https://yourapi.azurewebsites.net"; //client application id (see Azure Active Directory App registration //for your client app var clientId = "a71..."; //return url - not relevant for Native apps (just has to be valid url) var redirectUri = "https://just-some-valid-url.net"; AuthenticationContext authContext = new AuthenticationContext(string.Format ("https://login.windows.net/{0}", authority)); AuthenticationResult tokenAuthResult = authContext.AcquireTokenAsync(resource, clientId, new Uri(redirectUri), new PlatformParameters(PromptBehavior.Auto)).Result; return new TokenCredentials(tokenAuthResult.AccessToken); }