Tengo una aplicación web (alojada en IIS) que habla con un servicio de Windows. El servicio de Windows está utilizando la API web ASP.Net MVC (autohospedado), por lo que se puede comunicar a través de http utilizando JSON. La aplicación web está configurada para suplantar, la idea es que el usuario que realiza la solicitud a la aplicación web debe ser el usuario que la aplicación web utiliza para realizar la solicitud al servicio. La estructura se ve así:
(El usuario resaltado en rojo es el usuario al que se hace referencia en los ejemplos a continuación).
La aplicación web realiza solicitudes al servicio de Windows utilizando un HttpClient
:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Esto realiza la solicitud al servicio de Windows, pero no pasa las credenciales correctamente (el servicio informa al usuario como IIS APPPOOL\ASP.NET 4.0
). Esto no es lo que quiero que suceda .
Si cambio el código anterior para usar un WebClient
en su lugar, las credenciales del usuario se pasan correctamente:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Con el código anterior, el servicio informa al usuario como el usuario que realizó la solicitud a la aplicación web.
¿Qué estoy haciendo mal con la HttpClient
implementación que hace que no pase las credenciales correctamente (o es un error con el HttpClient
)?
La razón por la que quiero usar HttpClient
es que tiene una API asíncrona que funciona bien con Task
s, mientras que la WebClient
API asíncrona debe manejarse con eventos.
DownloadStringTaskAsync
en .Net 4.5, que también se puede usar con async / await
HttpClient
no tiene un SetCredentials()
método. ¿Puedes señalarme a qué te refieres?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }
en un servidor web al que accedía un usuario autenticado de Windows, y el sitio web se autenticó para otro recurso remoto después de eso (no se autenticaría sin el indicador establecido).