1

Я использую Owin для самостоятельного размещения веб-приложения.Как проверить подлинность с помощью смарт-карты в качестве отказа от проверки подлинности Windows в httpClint/httpListener

Схема аутентификации определяется на сервере выглядит следующим образом:

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 для автоматического выбора сертификата

    уаг клиента = нового HttpClient ( новый HttpClientHandler { ClientCertificateOptions = ClientCertificateOption.Automatic });

  • или путем настройки HttpClient с ранее выбранным сертификатом

    варом ClientHandler = новый WebRequestHandler(); clientHandler.ClientCertificates.Add (cert); var client = new HttpClient (clientHandler);

, где cert - это сертификат с соответствующим личным ключом.

Вы можете узнать больше об этом на Client Authentication