Windowsサービスと通信する(IISでホストされている)Webアプリケーションがあります。WindowsサービスはASP.Net MVC Web API(自己ホスト型)を使用しているため、JSONを使用してhttp経由で通信できます。Webアプリケーションは偽装を行うように構成されています。つまり、Webアプリケーションへの要求を行うユーザーは、Webアプリケーションがサービスへの要求を行うために使用するユーザーである必要があります。構造は次のようになります。
(赤で強調表示されているユーザーは、以下の例で参照されているユーザーです。)
Webアプリケーションは、HttpClient
次を使用してWindowsサービスにリクエストを送信します。
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
これにより、Windowsサービスへの要求が行われますが、資格情報は正しく渡されません(サービスはユーザーをとして報告しますIIS APPPOOL\ASP.NET 4.0
)。これは私が起こしたいことではありません。
上記のコードを変更してを使用するWebClient
と、ユーザーの認証情報が正しく渡されます。
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
上記のコードでは、サービスはユーザーをWebアプリケーションにリクエストを行ったユーザーとして報告します。
HttpClient
資格情報を正しく渡さない原因となっている実装で何が問題になっていますか(またはのバグHttpClient
ですか?)
を使用したいのHttpClient
は、Task
sでうまく機能する非同期APIがあるのに対して、WebClient
's asyc APIはイベントで処理する必要があるからです。
DownloadStringTaskAsync
.Net 4.5にあり、非同期/待機でも使用できます
HttpClient
がありませんSetCredentials()
。どういう意味か教えてもらえますか?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }
Windows認証されたユーザーがアクセスするWebサーバーで作成を試みましたが、そのWebサイトはその後、別のリモートリソースに対して認証を行いました(フラグを設定しないと認証されません)。