2017-02-14 5 views
0

Ich habe eine Webanwendung, die in IIS 7.5 unter Windows Server 2008 R2 und auf einem anderen Testcomputer in IIS 8.5 unter Windows Server 2012 R2 gehostet wird. Die Windows-Authentifizierung ist aktiviert und der Anwendungspool läuft unter einem Dienstkonto wie "Domänenname \ Domänenbenutzername".IIS 7.5 Web Application gibt Unauthorized bei Verwendung von HttpClient zurück

Ich verwende eine kleine C# -Konsolen-Testanwendung, um ein HttpClient-Objekt anzuzeigen und eine Controller-Aktion der Website aufzurufen, z. http://localhost/Api/TestAction. Beide Testsysteme verhalten sich unterschiedlich und ich verstehe nicht warum.

  • Test Case 1) ohne Berechtigungsnachweise
  • Test Case 2) mit "Standard-Credentials"
  • Test Case 3) mit den Zugangsdaten des Benutzers des AppPool ("Domänenname \ DomainUsername")

Testcase 1:

HttpClient client = new HttpClient(); 
var response = client.GetAsync(url).Result; 
Console.WriteLine(response.StatusCode); 

Testcase 2:

HttpClientHandler handler = new HttpClientHandler(); 
handler.UseDefaultCredentials = true; 
HttpClient client = new HttpClient(handler); 
var response = client.GetAsync(url).Result; 
Console.WriteLine(response.StatusCode); 

Testcase 3:

HttpClientHandler handler = new HttpClientHandler(); 
handler.Credentials = new NetworkCredential(username, password); 
HttpClient client = new HttpClient(handler); 
var response = client.GetAsync(url).Result; 
Console.WriteLine(response.StatusCode); 

Hier sind die Ergebnisse:

Windows Server 2008 R2 (IIS 7.5):

  • Test Case 1 - Unerlaubte
  • Testfall 2 - OK
  • Testfall 3 - Nicht autorisiert

Windows Server 2012 R2 (IIS 8.5):

  • Test Case 1 - Unerlaubte
  • Testfall 2 - OK
  • Test Case 3 - OK

Könnten Sie bitte helfen Sie mir zu verstehen, warum beide Testsysteme unterschiedliche Ergebnisse für Testfall 3 liefern (unter Verwendung von Anmeldeinformationen des apppool-Benutzers)? Und könnten Sie bitte erläutern, was "UseDefaultCredentials" bedeutet und welchen Einfluss dies auf das Autorisierungsproblem hat? Bisher habe ich keine Erklärung gefunden, die ich verstehe.

Danke!

+0

tut, ist es seltsam, etwas über Ihren Code: Sie rufen GetAsync Methode ohne die Anforderung Abschluss-Handler zu implementieren. Im Allgemeinen befindet sich Ihr Antwortobjekt in einem nicht definierten Status, bis die Anforderung verarbeitet wird. Wenn Sie sich die Methodenbeschreibung in MSDN ansehen, wird explizit angegeben: "Diese Operation wird nicht blockiert. Das zurückgegebene Aufgabenobjekt wird abgeschlossen, nachdem die gesamte Antwort (einschließlich Inhalt) gelesen wurde." Wenn Sie nicht mit dem Anforderungsabschlußhandler arbeiten möchten, können Sie stattdessen webClient.DownloadData verwenden. Dies ist eine synchrone Operation, für die kein Beendigungshandler erforderlich ist. –

+1

@VictorHavin: Durch Bezugnahme auf 'Result' des asynchronen Aufrufs synchronisiert er und ruft das Ergebnis der asynchronen Aufgabe ab. Keine Notwendigkeit für irgendwelche Komplettierungshandler dann. –

+0

@Delerium: Könnten Sie bitte überprüfen, was passiert, wenn Sie den Konstruktor "NetworkCredentials" mit drei statt zwei Argumenten aufrufen, wobei der dritte der Domänenname ist? –

Antwort

1

Eine Antwort von der OP in der folgenden Diskussion der Frage angenommen beinhaltet die NetworkCredentials Konstruktor mit drei Argumente statt zwei, der dritte Name der Domäne ist, aufrufen.

Mit anderen Worten, das funktioniert ein

NetworkCredentials("Username", "Password", "Doamin") 

wo diese nicht

NetworkCredentials("Domain\Username", "Password") 
Verwandte Themen