ASP.NET Core Web API使用客户端证书获取401来调用其他Web API

时间:2017-07-15 21:00:57

标签: c# asp.net-core x509certificate dotnet-httpclient client-certificates

我一直在尝试在过去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);
}

1 个答案:

答案 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 属性设置为 代表其发出请求的客户端的凭据。