Ich habe eine Webanwendung (in IIS gehostet), die mit einem Windows-Dienst kommuniziert. Der Windows-Dienst verwendet die ASP.Net MVC-Web-API (selbst gehostet) und kann daher über JSON über http kommuniziert werden. Die Webanwendung ist für den Identitätswechsel konfiguriert. Die Idee besteht darin, dass der Benutzer, der die Anforderung an die Webanwendung stellt, der Benutzer sein sollte, mit dem die Webanwendung die Anforderung an den Dienst sendet. Die Struktur sieht folgendermaßen aus:
(Der rot hervorgehobene Benutzer ist der Benutzer, auf den in den folgenden Beispielen verwiesen wird.)
Die Webanwendung sendet Anforderungen an den Windows-Dienst mit HttpClient
:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Dadurch wird die Anforderung an den Windows-Dienst gesendet, die Anmeldeinformationen werden jedoch nicht korrekt übergeben (der Dienst meldet den Benutzer als IIS APPPOOL\ASP.NET 4.0
). Das will ich nicht .
Wenn ich den obigen Code so ändere, dass WebClient
stattdessen a verwendet wird, werden die Anmeldeinformationen des Benutzers korrekt übergeben:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Mit dem obigen Code meldet der Dienst den Benutzer als den Benutzer, der die Anforderung an die Webanwendung gestellt hat.
Was mache ich falsch mit der HttpClient
Implementierung, die dazu führt, dass die Anmeldeinformationen nicht korrekt übergeben werden (oder liegt ein Fehler mit der vor HttpClient
)?
Der Grund, warum ich das verwenden möchte, HttpClient
ist, dass es eine asynchrone API hat, die gut mit Task
s funktioniert , während die WebClient
asyc-API der mit Ereignissen behandelt werden muss.
DownloadStringTaskAsync
in .Net 4.5, das auch mit async / await verwendet werden kann
HttpClient
hat keine SetCredentials()
Methode. Können Sie mich auf das hinweisen, was Sie meinen?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }
auf einem Webserver zu erstellen, auf den ein Windows-authentifizierter Benutzer zugreift, und die Website hat sich danach für eine andere Remote-Ressource authentifiziert (würde sich ohne gesetztes Flag nicht authentifizieren).