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 HttpClient
implementaçã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 Task
s, enquanto a WebClient
API assíncrona do s precisa ser manipulada com eventos.
DownloadStringTaskAsync
em .Net 4.5, que também pode ser usado com async / await
HttpClient
nã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).