前年我写过一篇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中的规则一样
到此为止配置就完成了,下面附上代码,注意几个参数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信息拷出来,解析下是否带有用户信息,如果有就表示是正确的。