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

   前年我写过一篇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可以随意写


    继续下一步,此处勾选第三个,点击复制剪贴板将其复制下来,后面的代码中也会用到


    继续下一步,此处的标识符即你CRM的web api的源地址(即后面代码中的resource参数)


  继续下一步,之后的都是默认的直到完成为止,最后要编辑下web api的颁发转换规则,同IFD部署时的Replying Party中的规则一样

扫描二维码关注公众号,回复: 2186882 查看本文章


  到此为止配置就完成了,下面附上代码,注意几个参数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&[email protected]&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信息拷出来,解析下是否带有用户信息,如果有就表示是正确的。



猜你喜欢

转载自blog.csdn.net/woniu1104913/article/details/80188291