Доступ к приложению-функции через аутентификацию службы приложений из подключаемого модуля Dynamics 365

Я пытаюсь получить доступ к функции Azure из подключаемого модуля Dynamics 365 через сервис для вызова сервиса: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-service-to-service

Эта функция защищена с помощью аутентификации службы приложений.

Я создал приложение-функцию и включил аутентификацию службы приложений в разделе «Функции платформы» -> «Аутентификация / авторизация». Я включил Azure Active Directory в качестве поставщика аутентификации и установил для режима управления значение Экспресс.

введите здесь описание изображения

Затем я получил сгенерированный идентификатор клиента и секрет клиента из расширенного режима:

введите здесь описание изображения

По-видимому, это все, что нужно, чтобы сделать запрос токена для функции Azure, исходя из статьи, мне нужно 4 обязательных параметра:

ID клиента

Секрет клиента

Тип гранта

Ресурс

Я делаю следующий запрос на создание токена из подключаемого модуля Dynamics 365, но получаю следующую ошибку:

Invalid Plugin Execution Exception: Microsoft.Xrm.Sdk.InvalidPluginExecutionException: {"error":"invalid_client","error_description":"AADSTS70002: Error validating credentials. AADSTS50012: Invalid client secret is provided.\r\nTrace ID: 06ddda7f-2996-4c9b-ab7e-b685ee933700\r\nCorrelation ID: d582e2f2-91eb-4595-b44b-e95f42f2f071\r\nTimestamp: 2018-05-23 06:30:58Z","error_codes":[70002,50012],"timestamp":"2018-05-23 06:30:58Z","trace_id":"06ddda7f-2996-4c9b-ab7e-b685ee933700","correlation_id":"d582e2f2-91eb-4595-b44b-e95f42f2f071"}-The remote server returned an error: (401) Unauthorized.

Мой код:

         var tokenendpoint = "https://login.microsoftonline.com/de194c13-5ff7-4085-91c3-ac06fb869f28/oauth2/token";
         var reqstring = "client_id=" + Uri.EscapeDataString("5f315431-e4da-4f68-be77-4e257b1b9295");
         reqstring += "&client_secret=" + Uri.EscapeDataString("/oK7nh8pl+LImBxjm+L7WsQdyILErysOdjpzvA9g9JA=");
         reqstring += "&resource=" + Uri.EscapeUriString("https://keyvaultaccess.azurewebsites.net");
         reqstring += "&grant_type=client_credentials";

         //Token request
         WebRequest req = WebRequest.Create(tokenendpoint);
         req.ContentType = "application/x-www-form-urlencoded";
         req.Method = "POST";
         byte[] bytes = System.Text.Encoding.ASCII.GetBytes(reqstring);
         req.ContentLength = bytes.Length;
         System.IO.Stream os = req.GetRequestStream();
         os.Write(bytes, 0, bytes.Length);
         os.Close();

         //Token response
         HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
         StreamReader tokenreader = new StreamReader(resp.GetResponseStream());
         string responseBody = tokenreader.ReadToEnd();

Я удостоверился, что у меня правильный секрет клиента, а также закодировал его, поскольку где-то читал, что «+» и «/» не подходят.

Я получаю ту же ошибку в почтальоне

Любые идеи??


person Stanza    schedule 23.05.2018    source источник
comment
Я изменил свой секрет на просто привет и все еще без радости   -  person Stanza    schedule 24.05.2018


Ответы (1)


reqstring + = "& resource =" + Uri.EscapeUriString ("https://keyvaultaccess.azurewebsites.net") ;

Поскольку вы установили для параметра resource значение https://keyvaultaccess.azurewebsites.net, я предположил, что вы установили для URI идентификатора приложения вашего приложения AAD (clientId равно 5f315431-xxxxxxx-4e257b1b9295) значение https://keyvaultaccess.azurewebsites.net. Я предполагаю, что вы можете получить access_token, но при доступе к конечной точке вашей Azure-функции с помощью access_token вы получили код состояния 401.

Вам необходимо изменить расширенный режим управления для аутентификации Active Directory, добавить https://keyvaultaccess.azurewebsites.net в РАЗРЕШЕННЫЕ АУДИТОРИИ ТОКЕНОВ или изменить параметр resource на свой идентификатор клиента AAD при отправке запроса токена для получения access_token.

Конфигурация аутентификации Active Directory:

введите здесь описание изображения

ТЕСТ:

введите здесь описание изображения

Закодируйте токен JWT, чтобы проверить свойство aud:

введите здесь описание изображения

Доступ к моей конечной точке функции Azure:

введите здесь описание изображения

Примечание. Вам необходимо позаботиться об уровне авторизации вашей функции следующим образом:

введите здесь описание изображения

Если вы также включаете аутентификацию на уровне функции, ваш запрос, отправленный в функцию azure, должен иметь соответствующий параметр кода в строке запроса или установить заголовок x-functions-key со значением вашей функциональной клавиши, или вы можете просто установить уровень авторизации на Анонимный.

person Bruce Chen    schedule 30.05.2018
comment
Привет, Брюс, извини, только что заметил твой ответ, в конце концов я сменил свой ресурс на свой идентификатор клиента, и все заработало. - person Stanza; 31.07.2018