Использование веб-интерфейса CRM 365 через HTTPS - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующий код, который работает, как и ожидалось:

            var credentials = new NetworkCredential(UserName, Password, Domain);
            var httpMessageHandler = new HttpClientHandler { Credentials = credentials };
            HttpClient httpClient = new HttpClient(httpMessageHandler);
            try
            {

                using (httpClient)
                {
                    httpClient.BaseAddress = new Uri(ResourceUrl);
                    httpClient.Timeout = new TimeSpan(0, 2, 0);  //2 minutes
                    var response = httpClient.GetAsync("data/v8.2/contacts?$top=1", HttpCompletionOption.ResponseHeadersRead).Result;
                    var response1Content = response.Content.ReadAsStringAsync().Result;
                }
            }

Однако, когда я пытаюсь получить доступ к тому же ресурсу через HTTPS (где ADFS 3 является полномочием), я не могу.

Microsoft предоставляет некоторый пример вспомогательного кода, инкапсулированного в Authorization класс здесь .Я использовал это, поэтому мой код теперь выглядит следующим образом:

            Configuration configuration = new Configuration();
            configuration.Username = UserName;
            configuration.Password = secure;
            configuration.Domain = Domain;
            configuration.ServiceUrl = ServiceUrl;
            configuration.RedirectUrl = RedirectUrl;
            configuration.ClientId = ClientId;

            var credentials = new NetworkCredential(UserName, Password, Domain);
            var httpMessageHandler = new HttpClientHandler { Credentials = credentials };
            Authentication authentication = new Authentication(configuration, AdfsUrl);
            OAuthMessageHandler oAuthHttpMessageHandler = new OAuthMessageHandler(authentication, httpMessageHandler);
            HttpClient httpClient = new HttpClient(oAuthHttpMessageHandler);

            try
            {
                using (httpClient)
                {
                    httpClient.BaseAddress = new Uri(ServiceUrl);
                    httpClient.Timeout = new TimeSpan(0, 2, 0);  //2 minutes
                    var response = httpClient.GetAsync("data/v8.2/contacts?$top=1", HttpCompletionOption.ResponseHeadersRead).Result;
                    var response1Content = response.Content.ReadAsStringAsync().Result;
                }
            }

Однако теперь это дает мне следующее исключение при попадании в эту строку:

var response = httpClient.GetAsync("data/v8.2/contacts?$top=1", HttpCompletionOption.ResponseHeadersRead).Result;

Любые предложения будут весьмаоценили.

1 Ответ

0 голосов
/ 16 января 2019

В итоге мне пришлось реализовать многошаговое индивидуальное решение:

ШАГ 1 .POST к

https://myadfs.com/adfs/oauth2/authorize?response_type=code&redirect_uri=https://mywebsiterequiringadfsauthorisation.com&resource=https://mywebsiterequiringadfsauthorisation.com&client_id=12ab34cd-12ab-12ab-12ab-12ab3412abcd&RedirectToIdentityProvider=https://myadfs.com//adfs/services/trust

и следующему телу:

Body:

response_type:code
redirect_uri:https://mywebsiterequiringadfsauthorisation.com
resource:https://mywebsiterequiringadfsauthorisation.com
client_id:12ab34cd-12ab-12ab-12ab-12ab3412abcd
RedirectToIdentityProvider:https://myadfs.com/adfs/services/trust  

Этот шаг в случае успеха возвращает 301Найден ответ от сервера.Заголовки ответа содержат Местоположение , которое выглядит примерно так:

Location:

https://mywebsiterequiringadfsauthorisation.com:443/?code=HotI0lPfMEGhcEo7zXqFEQ.yjKLgch71ggSADojHBJkCobAXTU.gomySyiXeFHuXohPstY5MOtH_eRp4Cnr65q3PaIEXZ-Fz3dp-e25hr09QDUDBCqz08ROWEN9tcoZEAwAKG_pepLTnNVHOZwbrhaYlc2XRjZ4IrCJGZPqfapnQphXDR_4cPl7tIIt3q7ORaVF5LbAyv76bTeCGqKSNsCmeP6IrGigZoDBBxAdfGMg-Pg_Ebs_SaPY1P3Q2egKkkpCYfks8-kkHJNAhS5Wv2Qio_XzIdUOO6zWU9YGdGQdC1U-VNeHwJDm8GzVtXxbD9aTdQFwdUlg2DELyQxEOPcDLQG2BKmdxRGF3jRd_OUvaIzsKVz4u0fcNpeIhXNHsYGtvRZHLw

STEP2 Извлеките код из заголовка / местоположения ответа и создайте второй запрос к ADFS:

POST к https://myadfs.com/adfs/oauth2/token со следующим содержимым тела:

Body:

client_id:12ab34cd-12ab-12ab-12ab-12ab3412abcd
redirect_uri:https://mywebsiterequiringadfsauthorisation.com
grant_type:authorization_code 
code:HotI0lPfMEGhcEo7zXqFEQ.yjKLgch71ggSADojHBJkCobAXTU.gomySyiXeFHuXohPstY5MOtH_eRp4Cnr65q3PaIEXZ-Fz3dp-e25hr09QDUDBCqz08ROWEN9tcoZEAwAKG_pepLTnNVHOZwbrhaYlc2XRjZ4IrCJGZPqfapnQphXDR_4cPl7tIIt3q7ORaVF5LbAyv76bTeCGqKSNsCmeP6IrGigZoDBBxAdfGMg-Pg_Ebs_SaPY1P3Q2egKkkpCYfks8-kkHJNAhS5Wv2Qio_XzIdUOO6zWU9YGdGQdC1U-VNeHwJDm8GzVtXxbD9aTdQFwdUlg2DELyQxEOPcDLQG2BKmdxRGF3jRd_OUvaIzsKVz4u0fcNpeIhXNHsYGtvRZHLw

Если все в порядке, вы должны получить ответ 200 OK с ответом JSON, содержащим ваш токен доступа:

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IlhscG9zR0pGbjE3OHlrNWFwcjl0R01ERGdwNCJ9.eyJhdWQiOiJodHRwczovL2N3Y3JtLnRoZWZhLmNvbS8iLCJpc3MiOiJodHRwczovL3dnc3N0c3IudGhlZmEuY29tL2FkZnMvc2VydmljZXMvdHJ1c3QiLCJpYXQiOjE1NDcxMTc3ODAsImV4cCI6MTU0NzIwNDE4MCwidXBuIjoicHJkX2N3MjAxNl9pbnRAdGhlZmEubG9jYWwiLCJwcmltYXJ5c2lkIjoiUy0xLTUtMjEtMTc1OTM5NjE5My0yMDMwMjE4Mzg4LTM0NjczNTc3OTMtMzc5NiIsInVuaXF1ZV9uYW1lIjoiVEhFRkFcXFBSRF9DVzIwMTZfSU5UIiwiYXV0aF90aW1lIjoiMjAxOS0wMS0xMFQxMDo1NjoxNC42NDVaIiwiYXV0aG1ldGhvZCI6InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkUHJvdGVjdGVkVHJhbnNwb3J0IiwidmVyIjoiMS4wIiwiYXBwaWQiOiIxMmFiMzRjZC0xMmFiLTEyYWItMTJhYi0xMmFiMzQxMmFiY2QifQ.fdvBavODiXOQM-UNBD59sgvqz357P5DzEOGifY0TfMZUjGrHc-IdZU9eqJNsUbtK4_FsrnoV6OKK8Vc4tvDITIw5D8i5uPP0tK_yDWs3Jdw5v3RUDDH2Q5yWrEed6KASO40q-YeowzMaLkf3EDE33Iyrh_J5K29hYnVJJ_4uVxAxdzIAM-Mp9HqfLtpwtEOyWe3PaTjGe8uGRXKstOFy0yNFvURaEohp628EYmA_lieTXA0TVVXG-KCV5QfuG7SWblErPR7nZI27iSs4xPyWkf68JfQOodfQ5iDHR3AWcWtNPd2b2h7VdKO3gMUsux9e__GO43Uzu9hf_l3nOMvNbA",
    "token_type": "bearer",
    "expires_in": 86400
}

ШАГ 3

Поместите токен доступа в заголовок любого последующего запроса.

...