1

我使用Owin自己託管Web應用程序。如何通過智能卡進行身份驗證作爲httpClint/httpListener中的Windows身份驗證的回退

在服務器中定義的身份驗證方案如下:

HttpListener listener = (HttpListener)app.Properties["System.Net.HttpListener"]; 
listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication; 

我的客戶端的代碼如下所示:

using (var webRequestHandler = new WebRequestHandler {UseDefaultCredentials = true}) 
using (var httpClient = new HttpClient(webRequestHandler)) 
{ 
    var responseCode = httpClient.PostAsync("https://server:443/myapi/dosomething/", null).Result.StatusCode; 
    Console.WriteLine(responseCode == HttpStatusCode.OK ? "Success" : "Failure"); 
} 

這個偉大的工程在客戶端的機器上時,登錄的用戶是用戶已知的服務器的機器。

例如,當客戶端的機器未加入域並且客戶端由本地用戶運行時,就會出現問題。在這種情況下,我已經延長我的客戶了一下,如下:

HttpStatusCode responseCode; 
using (var webRequestHandler = new WebRequestHandler {UseDefaultCredentials = true}) 
using (var httpClient = new HttpClient(webRequestHandler)) 
{ 
    responseCode = httpClient.PostAsync("https://server:443/myapi/dosomething/", null).Result.StatusCode; 
} 

if (responseCode == HttpStatusCode.Unauthorized) 
{ 
    string username; 
    string password; 
    // prompt user for credentials and store them at the above variables 

    using (var webRequestHandler = new WebRequestHandler { Credentials = new NetworkCredential(username, password)}) 
    using (var httpClient = new HttpClient(webRequestHandler)) 
    { 
     responseCode = httpClient.PostAsync("https://server:443/myapi/dosomething/", null).Result.StatusCode; 
    } 
} 
Console.WriteLine(responseCode == HttpStatusCode.OK ? "Success" : "Failure"); 

這解決了它,但我僅限於只執行使用用戶名/密碼的備用身份驗證。

我的問題是我需要支持智能卡身份驗證以及用戶名/密碼身份驗證。

回答

0

假設「智能卡認證」是通過客戶端證書完成後,你可以啓用這個功能,通過:

  • 配置HttpClient自動選擇證書

    VAR的客戶=新的HttpClient ( 新的HttpClientHandler {ClientCertificateOptions = ClientCertificateOption.Automatic });

  • 或通過與先前選擇的證書配置HttpClient

    變種ClientHandler的新= WebRequestHandler(); clientHandler.ClientCertificates.Add(cert); var client = new HttpClient(clientHandler);

其中cert是帶有關聯私鑰的證書。

您可以在此閱讀更多關於Client Authentication

相關問題