【问题标题】:ASP.NET Core Web API calling other Web API using Client Certificate getting 401ASP.NET Core Web API 使用客户端证书调用其他 Web API 得到 401
【发布时间】:2017-07-15 21:00:56
【问题描述】:

在过去的 20 分钟里,我一直在尝试向 .NET Core 1.1 WebAPI 中的 HttpClient 添加客户端证书,但无法弄清楚问题所在。当我调试程序并检查证书是否与处理程序一起附加时,我能够看到证书。不过,我仍然收到 401。我确定证书已正确安装在其他 API 上,因为我可以从另一个程序使用它进行调用。另一个程序正在使用 .NET Framework 4.5.2,但我怀疑这将是代码几乎相同的问题。唯一的区别是我需要为 .NET Core 使用 HttpClientHandler 而不是 WebRequestHandler。

.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);
}

【问题讨论】:

  • 你是说它在 4.5.2 版本中有效吗?问题不清楚。
  • 是的,它适用于 4.5.2。

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


【解决方案1】:

这是一篇较旧的帖子,但我使用证书时遇到了相同的情况。

确保HttpClientHandler 上的UseDefaultCredentials 属性设置为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 属性设置为 代表其发出请求的客户端的凭据。

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多