我一直在尝试在过去20分钟内在.NET Core 1.1 WebAPI中向HttpClient添加客户端证书,但无法弄清楚问题所在。当我调试程序并检查证书是否与处理程序附加时,我能够看到证书。我仍然收到401。我确信证书已正确安装在其他API上,因为我可以使用其他程序进行调用。另一个程序正在使用.NET Framework 4.5.2,但我怀疑代码几乎完全相同的问题。唯一的区别是我需要为.NET Core而不是WebRequestHandler使用HttpClientHandler。
.NET Core 1.1
string uri = "https://other-api-url.com/something";
try
{
X509Certificate2 clientCert = GetClientCertificate();
HttpClientHandler client = new HttpClientHandler();
requestHandler.ClientCertificates.Add(clientCert);
HttpClient client = new HttpClient(requestHandler)
{
BaseAddress = new Uri(uri)
};
HttpResponseMessage response = client.GetAsync("").Result;
response.EnsureSuccessStatusCode();
string responseContent = response.Content.ReadAsStringAsync().Result;
return Ok(responseContent);
}
catch (Exception ex)
{
return BadRequest(ex.Message + uri);
}
.NET Framework 4.5.2代码:
string uri = "https://other-api-url.com/something";
try
{
X509Certificate2 clientCert = GetClientCertificate();
WebRequestHandler requestHandler = new WebRequestHandler();
requestHandler.ClientCertificates.Add(clientCert);
HttpClient client = new HttpClient(requestHandler)
{
BaseAddress = new Uri(uri)
};
HttpResponseMessage response = client.GetAsync("").Result;
response.EnsureSuccessStatusCode();
string responseContent = response.Content.ReadAsStringAsync().Result;
return Ok(responseContent);
}
catch (Exception ex)
{
return BadRequest(ex.Message + uri);
}
答案 0 :(得分:0)
这是一篇较旧的帖子,但我有使用证书的相同场景。
确保 UseDefaultCredentials
上的 HttpClientHandler
属性设置为 true
。因为默认是false
。
请参阅下面来自 HttpClientHandler 类的引用: https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.usedefaultcredentials?view=net-5.0#System_Net_Http_HttpClientHandler_UseDefaultCredentials
<块引用>当 HttpClientHandler 发出请求时,将此属性设置为 true 如果服务器请求,对象应该使用 当前登录用户的凭据。对于客户端应用程序, 这是大多数情况下所需的行为。对于中层 应用程序,例如 ASP.NET 应用程序,而不是使用它 属性,您通常会将 Credentials 属性设置为 代表其发出请求的客户端的凭据。