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

先上配置,打开 ADFS 配置界面,点击应用程序组,添加应用程序组,此处我们选择客户端的第二个(即我图中红框选中的)

img点击下一步,此处的客户端标识符拷贝记下来(后面代码中 clientid 的参数就是这个),重定向 URI 可以随意写,我写的是 http://localhost/callback,客户端标识符复制出来,也就是我们要用到的 client_id

img

继续下一步,此处勾选第三个,点击复制剪贴板将其复制下来,后面的代码中的 client_secret 就是这个

img

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

img

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

到此为止配置就完成了,下面附上代码,注意几个参数 client_id,client_secret,resource 我在上面配置的时候都有提过


// 创建 HttpClient 实例,用于发送 HTTP 请求
HttpClient _httpClient = new HttpClient();

// 设置 HttpClient 的基础地址(后续请求若使用相对路径会基于此地址,此处后续请求用了完整 URL,故该设置在此场景中未实际生效)
_httpClient.BaseAddress = new Uri("https://crmdev.contoso.com/");

// 向默认请求头添加 Accept 头,指定接受 JSON 格式的响应
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

// 添加 OData-MaxVersion 请求头,指定支持的最高 OData 版本为 4.0
_httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");

// 添加 OData-Version 请求头,指定使用的 OData 版本为 4.0
_httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0");

// 创建表单编码的内容,包含 OAuth2 密码模式所需的参数
var content = new FormUrlEncodedContent(new[] {
new KeyValuePair<string,string>("client_id","f8584bf9-e434-4d37-881f-daf40b0bb1ad"), // 客户端 ID,标识请求的应用
new KeyValuePair<string,string>("client_secret","lNHrjRajQmOAgCZYnxg1ysqwBkiAMPNxn1g1fhTX"), // 客户端密钥,用于验证应用身份
new KeyValuePair<string,string>("resource","https://crmdev.contoso.com/api/data/v9.1"), // 目标资源地址,即要访问的 API
new KeyValuePair<string,string>("username",@"contoso\administrator"), // 用户名,用于身份验证
new KeyValuePair<string,string>("password","admin1234"), // 密码,用于身份验证
new KeyValuePair<string,string>("grant_type","password"), // 授权类型,此处为密码模式
});

// 发送 POST 请求到 ADFS 的 token 端点,获取访问令牌
var res = _httpClient.PostAsync("https://adfs.contoso.com/adfs/oauth2/token", content);

// 等待请求完成并读取响应内容为字符串(同步等待,可能导致阻塞)
var respo = res.Result.Content.ReadAsStringAsync().Result;

// 解析 JSON 响应,提取 access_token(访问令牌)
var accesstoken = JObject.Parse(respo).GetValue("access_token").ToString();

// 创建要访问的 CRM API 的 URI(获取前 1 条账户数据)
var myUri = new Uri("https://crmdev.contoso.com/api/data/v9.1/accounts?$top=1");

// 根据 URI 创建 WebRequest 实例
var myWebRequest = WebRequest.Create(myUri);

// 将 WebRequest 转换为 HttpWebRequest,以便设置 HTTP 特定的属性
var myHttpWebRequest = (HttpWebRequest)myWebRequest;

// 设置是否在发送请求前进行预认证
myHttpWebRequest.PreAuthenticate = true;

// 添加 Authorization 请求头,使用 Bearer 令牌认证方式,值为获取到的访问令牌
myHttpWebRequest.Headers.Add("Authorization", "Bearer" + accesstoken);

// 设置 Accept 头,指定接受 JSON 格式的响应
myHttpWebRequest.Accept = "application/json";

// 发送请求并获取响应
var myWebResponse = myWebRequest.GetResponse();

// 从响应中获取响应流(包含返回的数据)
var responseStream = myWebResponse.GetResponseStream();

// 创建 StreamReader 读取响应流,使用默认编码
var myStreamReader = new StreamReader(responseStream, Encoding.Default);

// 读取流中的所有内容为 JSON 字符串
var json = myStreamReader.ReadToEnd();

// 关闭响应流
responseStream.Close();

// 关闭 Web 响应
myWebResponse.Close();
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐