Windows サービスと通信する Web アプリケーション (IIS でホスト) があります。Windows サービスは ASP.Net MVC Web API (自己ホスト) を使用しているため、JSON を使用して http 経由で通信できます。Web アプリケーションは偽装を行うように構成されています。これは、Web アプリケーションに要求を行うユーザーが、Web アプリケーションがサービスに要求を行うために使用するユーザーであるべきであるという考え方に基づいています。構造は次のようになります。
(赤で強調表示されているユーザーは、以下の例で参照されているユーザーです。)
ウェブアプリケーションは、Windowsサービスにリクエストを送信します。HttpClient
:
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
は とうまく連携する非同期 API があるのに対しTask
、WebClient
の非同期 API はイベントで処理する必要があるためです。
ベストアンサー1
次のように資格情報を自動的に渡すように設定できますHttpClient
。
var myClient = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });