Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ADFS 3.0进行Dynamics CRM api HttpClient请求身份验证_C#_Dynamics Crm_Adfs - Fatal编程技术网

C# 使用ADFS 3.0进行Dynamics CRM api HttpClient请求身份验证

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

我有一个内部动态CRM(2016),配置了ADFS(3.0)。当用户想要登录时,他们会被重定向到ADFS登录页面,用户会输入他们的Windows AD凭据

从.net核心应用程序中,我需要使用HttpClient向CRM api发出请求。当我尝试像通常那样发送Windows Auth CRM的凭据时,它不起作用。我得到了一份未经授权的401。如下图所示

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中设置的用户
    • 密码-上述用户的密码
然后,我们使用HttpClient使用这些信息进行以下调用

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");