私は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");
をそして、これはそれを解決しますが、私は唯一のユーザー名/パスワードを使用してフォールバック認証を実行することが制限されたんです。
私の問題は、スマートカード認証とユーザー名/パスワード認証をサポートする必要があるということです。