C# 使用ADFS 3.0进行Dynamics CRM api HttpClient请求身份验证
我有一个内部动态CRM(2016),配置了ADFS(3.0)。当用户想要登录时,他们会被重定向到ADFS登录页面,用户会输入他们的Windows AD凭据 从.net核心应用程序中,我需要使用HttpClient向CRM api发出请求。当我尝试像通常那样发送Windows Auth CRM的凭据时,它不起作用。我得到了一份未经授权的401。如下图所示C# 使用ADFS 3.0进行Dynamics CRM api HttpClient请求身份验证,c#,dynamics-crm,adfs,C#,Dynamics Crm,Adfs,我有一个内部动态CRM(2016),配置了ADFS(3.0)。当用户想要登录时,他们会被重定向到ADFS登录页面,用户会输入他们的Windows AD凭据 从.net核心应用程序中,我需要使用HttpClient向CRM api发出请求。当我尝试像通常那样发送Windows Auth CRM的凭据时,它不起作用。我得到了一份未经授权的401。如下图所示 HttpClient client = new HttpClient(new HttpClientHandler() { Credentials
HttpClient client = new HttpClient(new HttpClientHandler() { Credentials = new NetworkCredential("myuser", "mypassword", "mydomain") });
var result = client.GetAsync("https://mycrmaddress/api/data/v8.0/accounts");
我还尝试使用Adal检索令牌并将其作为承载令牌附加到请求中,但无法使用Adal获取令牌。当我尝试时,我收到以下信息:
The authorization server does not support the requested 'grant_type'. The authorization server only supports 'authorization_code'
ADFS 3.0不支持此流
我无法升级到ADFS 4.0,因此我想知道对CRM api进行身份验证调用的选项是什么(由于此应用程序是一项服务,因此不提示登录窗口)
我可以在ADF上进行任何配置,这样我的第一个示例就可以工作了吗?或者,即使是ADFS 3.0,也可以使用Adal实现吗?或任何其他解决方案…我找到了问题的答案。这有点骇人,但我自己测试过,效果不错。作为一个临时解决方案,这将达到目的 详情如下:
ADFS 3.0支持授权代码流,我们将在本例中使用此代码流
- 我们需要检索授权码。通常在此步骤中,系统会提示windows用户输入其凭据。通过发布并发送用户/密码,可以检索授权代码
- {authProvider}-adfsuri-类似
- {ClientId}-用于 由您的基础架构团队将您的应用程序添加到ADFS
- {RedirectUri}-动态的IFD Uri-应该与重定向匹配 基础架构团队用于将应用程序添加到的Url ADF
- 用户名-在ADFS和Dynamics中设置的用户
- 密码-上述用户的密码
var uri = $"{authProvider}authorize?response_type=code&client_id={clientId}&resource={redirectUri}&redirect_uri={redirectUri}";
var content = new FormUrlEncodedContent(new[] {
new KeyValuePair<string,string>("username",username),
new KeyValuePair<string,string>("password",password),
});
var responseResult = _httpManager.PostAsync(uri, content).Result;
从现在起,您可以调用CRM api,您将获得授权。然而要小心,通常访问令牌是短期的。您需要增加他们的生存期,或者在每次令牌过期时请求一个新令牌
var uri = $"{authProvider}token";
var content = new FormUrlEncodedContent(new[] {
new KeyValuePair<string,string>("grant_type","authorization_code"),
new KeyValuePair<string,string>("client_id",clientId),
new KeyValuePair<string,string>("redirect_uri",redirectUri),
new KeyValuePair<string,string>("code",code)
});
var response = await _httpManager.PostAsync(uri, content);
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",token);
httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0");