簡體   English   中英

ASP.NET Core Web API 使用客戶端證書調用其他 Web API 獲取 401

[英]ASP.NET Core Web API calling other Web API using Client Certificate getting 401

在過去的 20 分鍾里,我一直在嘗試向 .NET Core 1.1 WebAPI 中的 HttpClient 添加客戶端證書,但無法弄清楚問題是什么。 當我調試程序並檢查證書是否附加到處理程序時,我能夠看到證書。 不過我還是收到了 401。 我確信該證書已正確安裝在另一個 API 上,因為我可以從另一個程序使用它進行調用。 另一個程序使用 .NET Framework 4.5.2,但我懷疑這將是代碼幾乎相同的問題。 唯一的區別是我需要為 .NET Core 使用 HttpClientHandler 而不是 WebRequestHandler。

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

這是一篇較舊的帖子,但我有使用證書的相同場景。

確保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 屬性設置為代表其發出請求的客戶端的憑據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM