web-dev-qa-db-ja.com

HttpClientを使用してASP.NET Web Apiサービスに対して認証できない

Windows認証が有効になっているWebサーバーで実行されるASP.NET Web APIサービスがあります。

HttpClientを使用してサービスからデータをプルする同じWebサーバー上の別のサイトで実行されるMVC4上に構築されたクライアントサイトがあります。このクライアントサイトは、ID偽装を有効にして実行され、Windows認証も使用します。

Webサーバーは、IIS 7.5のWindows Server 2008 R2です。

私が抱えている課題は、HttpClientが現在のWindowsユーザーを認証プロセスの一部として渡すようにすることです。この方法でHttpClientを構成しました。

var clientHandler = new HttpClientHandler();
clientHandler.UseDefaultCredentials = true;
clientHandler.PreAuthenticate = true;
clientHandler.ClientCertificateOptions = ClientCertificateOption.Automatic;
var httpClient = new HttpClient(clientHandler);

私の理解では、ID偽装を有効にしてサイトを実行し、この方法でクライアントを構築すると、現在ログインしているユーザーの偽装IDを使用してクライアントがサービスに認証されるはずです。

これは起きていません。実際、クライアントは認証を行っていないようです。

サービスはWindows認証を使用するように構成されており、これは完全に機能するようです。 Webブラウザで http:// server/api/shippers に移動し、Windows認証を求められます。入力すると、要求されたデータを受け取ります。

IISログでは、APIリクエストが認証なしで受信され、401チャレンジ応答を受信して​​います。

これに関する文書はまばらなようです。

何が間違っているのか、このアプリケーションでWindows認証を使用する別の方法についての洞察が必要です。

ありがとう、クレイグ

36
Craig Anderson

私も同じ問題を抱えていました。 @tpeczekが行った調査のおかげで、次のソリューションを開発しました。HttpClient(スレッドを作成してリクエストを非同期に送信する)を使用する代わりに、同じスレッドでリクエストを発行するWebClientクラスを使用しました。そうすることで、ユーザーのIDを別のASP.NETアプリケーションからWebAPIに渡すことができます。

明らかな欠点は、これが非同期に機能しないことです。

var wi = (WindowsIdentity)HttpContext.User.Identity;

var wic = wi.Impersonate();
try
{
    var data = JsonConvert.SerializeObject(new
    {
        Property1 = 1,
        Property2 = "blah"
    });

    using (var client = new WebClient { UseDefaultCredentials = true })
    {
        client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
        client.UploadData("http://url/api/controller", "POST", Encoding.UTF8.GetBytes(data));
    }
}
catch (Exception exc)
{
    // handle exception
}
finally
{
    wic.Undo();
}

注: NuGetパッケージが必要です:Newtonsoft.Jsonは、WebAPIが使用するJSONシリアライザーと同じです。

9
Joshua

これが機能しない理由は、二重ホップ認証が必要だからです。

最初のホップはWebサーバーであり、Windows認証の偽装が機能しても問題はありません。ただし、HttpClientまたはWebClientを使用してユーザーを別のサーバーに認証する場合、Webサーバーは必要な委任を行う権限を持つアカウントで実行する必要があります。

詳細については、次を参照してください。
http://blogs.technet.com/b/askds/archive/2008/06/13/understanding-kerberos-double-hop.aspx

「setspn」コマンドを使用して修正します。
http://www.phishthis.com/2009/10/24/how-to-configure-ad-sql-and-iis-for-two-hop-kerberos-authentication-2 / (これらの操作を実行するには十分なアクセス権が必要です。)

資格情報の転送を許可されたサーバーが許可された場合にどうなるかを検討してください。

0
Luis Cantero

元の(認証された)ユーザーを偽装するには、Web.configファイルで次の構成を使用します。

<authentication mode="Windows" />
<identity impersonate="true" />

この構成では、ASP.NETは常に認証済みユーザーを偽装し、すべてのリソースアクセスは認証済みユーザーのセキュリティコンテキストを使用して実行されます。

0
Hardik Patel