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

「スマートカード認証」がクライアント側の証明書を介して行われると仮定すると、あなたはどちらかによって、この機能を有効にすることができます自動的に証明書

VARクライアント=新しいのHttpClientを選択しHttpClientを設定

  • は、 ( 新しいHttpClientHandler { ClientCertificateOptions = ClientCertificateOption.Automatic });

  • または以前に選択した証明書とHttpClientを構成することにより

  • するvar ClientHandlerの=新しいWebRequestHandler()。 clientHandler.ClientCertificates.Add(cert); var client =新しいHttpClient(clientHandler);

ここで、certは、関連付けられた秘密鍵を持つ証明書です。

Client Authentication

関連する問題