Eu tenho um aplicativo Web (hospedado no IIS) que fala com um serviço do Windows. O serviço do Windows está usando a API da Web do ASP.Net MVC (auto-hospedado) e, portanto, pode ser comunicado através de http usando JSON. O aplicativo da web está configurado para fazer representação, com a idéia de que o usuário que faz a solicitação para o aplicativo da web seja o usuário que o aplicativo da web usa para fazer a solicitação ao serviço. A estrutura fica assim:

(O usuário destacado em vermelho é o usuário referido nos exemplos abaixo.)
O aplicativo Web faz solicitações para o serviço Windows usando um HttpClient:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Isso faz a solicitação ao serviço do Windows, mas não passa as credenciais corretamente (o serviço relata o usuário como IIS APPPOOL\ASP.NET 4.0). Não é isso que eu quero que aconteça .
Se eu alterar o código acima para usar um WebClient, as credenciais do usuário serão passadas corretamente:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Com o código acima, o serviço relata o usuário como o usuário que fez a solicitação para o aplicativo Web.
O que estou fazendo de errado com a HttpClientimplementação que está fazendo com que ela não passe as credenciais corretamente (ou é um bug com o HttpClient)?
A razão pela qual desejo usar o HttpClienté que ele possui uma API assíncrona que funciona bem com Tasks, enquanto a WebClientAPI assíncrona do s precisa ser manipulada com eventos.
DownloadStringTaskAsyncem .Net 4.5, que também pode ser usado com async / await
HttpClientnão possui um SetCredentials()método. Você pode me indicar o que você quer dizer?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }em um servidor da web acessado por um usuário autenticado pelo Windows, e o site foi autenticado para outro recurso remoto depois disso (não seria autenticado sem o sinalizador definido).