I have a web application (hosted in IIS) that talks to a Windows service. The Windows service is using the ASP.Net MVC Web API (self-hosted), and so can be communicated with over http using JSON. The web application is configured to do impersonation, the idea being that the user who makes the request to the web application should be the user that the web application uses to make the request to the service. The structure looks like this:
(The user highlighted in red is the user being referred to in the examples below.)
The web application makes requests to the Windows service using an HttpClient
:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
This makes the request to the Windows service, but does not pass the credentials over correctly (the service reports the user as IIS APPPOOL\ASP.NET 4.0
). This is not what I want to happen.
If I change the above code to use a WebClient
instead, the credentials of the user are passed correctly:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
With the above code, the service reports the user as the user who made the request to the web application.
What am I doing wrong with the HttpClient
implementation that is causing it to not pass the credentials correctly (or is it a bug with the HttpClient
)?
The reason I want to use the HttpClient
is that it has an async API that works well with Task
s, whereas the WebClient
's asyc API needs to be handled with events.
DownloadStringTaskAsync
in .Net 4.5, which can also be used with async/await – PertinentHttpClient
doesn't have aSetCredentials()
method. Can you point me to what you mean? – LordICredentials
objects which I don't have as I'm using Windows Authentication. – Lordnew HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }
on a web server accessed by a Windows-authenticated user, and the web site did authenticate for another remote resource after that (would not authenticate without the flag set). – Salvatore