Почему мое приложение Azure AD не разрешает предоставление oauth client_credentials?
Я хочу использовать API Azure Graph, но сначала мне нужен токен oauth. Чтобы получить токен, я пытаюсь использовать Microsoft.IdentityModel.Clients.ActiveDirectory, также известный как ADAL версии 1.0.3 (из NuGet).
Я использую перегрузку AuthenticationContext.AcquireToken, которая принимает объект ClientCredential. (Я не могу использовать перегрузку, которая предлагает пользователю войти в систему, потому что я пишу службу, а не приложение.)
Я настроил свое веб-приложение Azure AD, как описано в различных руководствах / примерах (например, ADAL - проверка подлинности сервера на сервер).
Мой код выглядит так:
AuthenticationContext ac = new AuthenticationContext("https://login.windows.net/thommmondago.onmicrosoft.com");
ClientCredential cc = new ClientCredential("41151135-61b8-40f4-aff7-8627e9eaf853", clientSecretKey);
AuthenticationResult result = ac.AcquireToken("https://graph.windows.net", cc);
Строка AcquireToken
вызывает исключение:
sts_token_request_failed: Token request to security token service failed. Check InnerException for more details
Внутреннее исключение - это WebException, а полученный ответ выглядит как ошибка oauth:
{ "error":"invalid_client",
"error_description":"ACS50012: Authentication failed."
"error_codes":[50012],
"timestamp":"2014-03-17 12:26:19Z",
"trace_id":"a4ee6702-e07b-40f7-8248-589e49e96a8d",
"correlation_id":"b304af2e-2748-4067-99d0-2d7e55b121cd" }
Обход ADAL и использование curl с конечной точкой oauth также дает ту же ошибку.
Мой код работает, если я использую детали найденного мной приложения Azure здесь:
AuthenticationContext ac = new AuthenticationContext("https://login.windows.net/graphDir1.onmicrosoft.com");
ClientCredential cc = new ClientCredential("b3b1fc59-84b8-4400-a715-ea8a7e40f4fe", "FStnXT1QON84B5o38aEmFdlNhEnYtzJ91Gg/JH/Jxiw=");
AuthenticationResult result = ac.AcquireToken("https://graph.windows.net", cc);
Так что это не ошибка моего кода. Я думаю, что это либо ошибка моего Azure AD, либо у меня неверные параметры ClientCredential.
4 ответа
Это оказалось ошибкой в Windows Azure, с моим кодом или конфигурацией все было в порядке.
После того, как Microsoft устранила проблему в Azure, мне пришлось создать новое приложение, и оно начало работать.
Hi,
Мы наблюдаем некоторые ошибки с приложениями, созданными за несколько дней, заканчивающихся вчера. Мы продолжаем исправлять эти приложения, но я не знаю, когда это будет сделано. Приношу свои извинения за удар здесь.
Можете ли вы попробовать создать новое приложение и повторить операцию с новым идентификатором клиента?
Благодарность
Взгляните на эту ссылку: https: // azure .microsoft.com / en-gb / documentation / articles / resource-manager-net-sdk /
Последняя версия библиотеки проверки подлинности Active Directory не поддерживает метод AcquireToken, вместо этого необходимо использовать метод AcquireTokenAsync.
var result = await authenticationContext.AcquireTokenAsync(resource: "https://{domain}.onmicrosoft.com/{site-if applicable}", clientCredential: credential);
У меня была такая же проблема, но код запускался только непосредственно из Azure (на веб-сайте Azure).
Я решил обновить пакет Microsoft.IdentityModel.Clients.ActiveDirectory до 2.6.1-alpha.
Лазурная версия переводчика снова изменила ситуацию - запрос токена Oauth использует новый URL-адрес и требует только ваш секретный ключ вместо всего остального багажа. На этой странице это обсуждается (но с использованием кода PHP): http: // www. bradymoritz.com/php-code-for-bingmicrosoftazure-translator/
Ключевые пункты:
- Отправьте пустой запрос на https://api.cognitive.microsoft.com/sts /v1.0/issueToken
- Передайте ему свой секретный ключ, используя заголовок «Ocp-Apim-Subscription-Key:»
- Или просто используйте параметр строки запроса: "Subscription-Key ="
Затем получите тело возврата как фактический токен - это все тело, а не в формате json.
Это намного проще, чем использовавшийся ранее метод, но определенно было бы неприятно, если бы все снова изменилось.
Похожие вопросы
Связанные вопросы
Новые вопросы
azure
Microsoft Azure - это платформа для облачных вычислений «Платформа как услуга» и «Инфраструктура как услуга». Используйте этот тег для вопросов по программированию, касающихся Azure. Общая справка по серверу может быть получена в разделе «Суперпользователь» или «Ошибка сервера».