Dynamics 365 基於ADFS 2016(4.0)的OAuth2 CRM Web API Request

vic0228發表於2018-05-03

   前年我寫過一篇Dynamics 365 Online基於OAuth2身份驗證的Web Api Request,點選檢視,該方式是基於azure的,需要在azure中註冊clientid,在這之後嘗試過on-presimes的server-side的OAuth搞Web Api Request一直沒有成功,後來得知是因為adfs3.0不支援,最近在Windows server2016上操作成功了,也就是adfs4.0版本,這個版本中引入了application groups。

   本篇即來分享下,如何配置adfs4.0的application groups,以及c#程式碼示例。

   先上配置,開啟adfs配置介面,點選應用程式組,新增應用程式組,此處我們選擇client端的第二個(即我圖中紅框選中的)

    點選下一步,此處的客戶端識別符號拷貝記下來(後面程式碼中clientid的引數就是這個),重定向URI可以隨意寫

    繼續下一步,此處勾選第三個,點選複製剪貼簿將其複製下來,後面的程式碼中的client_secret就是這個

    繼續下一步,此處的識別符號即你CRM的web api的源地址(即後面程式碼中的resource引數)

  繼續下一步,之後的都是預設的直到完成為止,最後要編輯下web api的頒發轉換規則,同IFD部署時的Replying Party中的規則一樣

  到此為止配置就完成了,下面附上程式碼,注意幾個引數client_id,client_secret,resource我在上面配置的時候都有提過

HttpClient _httpClient = new HttpClient();
            _httpClient.BaseAddress = new Uri("https://demo.vyung.com:446/");
            _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            _httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
            _httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0");
            var content = new FormUrlEncodedContent(new[] {
                new KeyValuePair<string,string>("client_id","f55ece56-96ce-4d6d-a15a-e13228314224"),
                new KeyValuePair<string,string>("client_secret","A6raiZccmuQ1YB8qOFWUkR-iXwr8otZZE-eoTzXO"),
                new KeyValuePair<string,string>("resource","https://demo.domain.com:446/api/data/v8.2"),
                new KeyValuePair<string,string>("username",@"domain\crmadmin"),
                new KeyValuePair<string,string>("password","password01"),
                new KeyValuePair<string,string>("grant_type","password"),
                         });
            var res = _httpClient.PostAsync("https://sts.domain.com/adfs/oauth2/token", content);
            var respo = res.Result.Content.ReadAsStringAsync().Result;
            var accesstoken = JObject.Parse(respo).GetValue("access_token").ToString();

            var myUri = new Uri("https://demo.domain.com:446/api/data/v8.2/accounts?$top=1");
            var myWebRequest = WebRequest.Create(myUri);
            var myHttpWebRequest = (HttpWebRequest)myWebRequest;
            myHttpWebRequest.PreAuthenticate = true;
            myHttpWebRequest.Headers.Add("Authorization", "Bearer " + accesstoken);
            myHttpWebRequest.Accept = "application/json";

            var myWebResponse = myWebRequest.GetResponse();
            var responseStream = myWebResponse.GetResponseStream();         

            var myStreamReader = new StreamReader(responseStream, Encoding.Default);
            var json = myStreamReader.ReadToEnd();

            responseStream.Close();
            myWebResponse.Close();

看下取到的accesstoken

我們可以把token解析出來看下,帶了使用者的upn等資訊

最後看下web api 獲取到的資料,取得是account的第一條資料叫做Fourth Coffee(sample)的示例資料,成功獲取。

當然你如果不想在vs中寫程式碼呼叫測試,也可以用fiddler跟蹤下,requestbody如下

grant_type=password&username=crmadmin@domain.com&password=Password01&client_id=f55ece56-96ce-4d6d-a15a-e13228314224&redirect_uri=http://localhost/callback&client_secret=A6raiZccmuQ1YB8qOFWUkR-iXwr8otZZE-eoTzXO&resource=https://demo.domain.com:446/api/data/v8.2/

 

 

   然後把token資訊拷出來,解析下是否帶有使用者資訊,如果有就表示是正確的。

 

相關文章