Почему мое приложение 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.

9
tjleigh 17 Мар 2014 в 18:28
Если ваш код работает с демонстрационными учетными данными, это похоже на проблему с вашей конфигурацией. Настроили ли вы свой домен на портале управления Azure в URI идентификатора приложения? Это должно соответствовать вашему параметру «ресурс». Также перепроверьте свой клиентский секрет.
 – 
davo
18 Мар 2014 в 04:39
Ресурс, для которого мне нужен токен, — это API-интерфейс Graph, поэтому я установил URI идентификатора приложения в конечную точку графа (с кнопки «Просмотреть конечные точки») и использовал его в параметре ресурса. Также сгенерирован новый секретный ключ. Тот же результат.
 – 
tjleigh
19 Мар 2014 в 17:40
Можете ли вы попробовать https://graph.windows.net в качестве URI идентификатора приложения? Это то, что я использую для того же сценария. (Извините, пришлось поставить пробел в URL, чтобы он не автоформатировался)
 – 
davo
19 Мар 2014 в 22:23
Спасибо за ваши усилия, чтобы помочь, в конце концов, это была проблема с Azure. К вашему сведению, я не мог установить URI идентификатора приложения на https://graph.windows.net, Azure предотвратил это.
 – 
tjleigh
20 Мар 2014 в 15:53

4 ответа

Лучший ответ

Это оказалось ошибкой в ​​Windows Azure, с моим кодом или конфигурацией все было в порядке.

После того, как Microsoft устранила проблему в Azure, мне пришлось создать новое приложение, и оно начало работать.

Ответ на форуме от Microsoft:

Hi,

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

Можете ли вы попробовать создать новое приложение и повторить операцию с новым идентификатором клиента?

Благодарность

6
tjleigh 20 Мар 2014 в 15:52

Взгляните на эту ссылку: 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);
2
Arun Kumar 11 Июл 2016 в 16:34
Ссылка на документ битая
 – 
Michael Freidgeim
2 Авг 2017 в 03:26

У меня была такая же проблема, но код запускался только непосредственно из Azure (на веб-сайте Azure).

Я решил обновить пакет Microsoft.IdentityModel.Clients.ActiveDirectory до 2.6.1-alpha.

1
emmekappa 25 Апр 2014 в 05:43
Я создал проект, используя шаблон по умолчанию, как описано в asp.net/identity/overview/getting-started/… в выпуске сообщества VS-2013. Он ссылался на версию 1.0.0 «Microsoft.IdentityModel.Client.ActiveDirectory». Обновил его до последней версии (2.12.111071459) с помощью nuget. Все заработало :-))
 – 
Learner
27 Ноя 2014 в 13:10

Лазурная версия переводчика снова изменила ситуацию - запрос токена Oauth использует новый URL-адрес и требует только ваш секретный ключ вместо всего остального багажа. На этой странице это обсуждается (но с использованием кода PHP): http: // www. bradymoritz.com/php-code-for-bingmicrosoftazure-translator/

Ключевые пункты:

  1. Отправьте пустой запрос на https://api.cognitive.microsoft.com/sts /v1.0/issueToken
  2. Передайте ему свой секретный ключ, используя заголовок «Ocp-Apim-Subscription-Key:»
  3. Или просто используйте параметр строки запроса: "Subscription-Key ="

Затем получите тело возврата как фактический токен - это все тело, а не в формате json.

Это намного проще, чем использовавшийся ранее метод, но определенно было бы неприятно, если бы все снова изменилось.

0
Brady Moritz 10 Ноя 2016 в 02:00