2009-03-29 11 views
23

Ich habe eine Situation mit einer großen internen Corporate Web-basierten Anwendung mit ASP.NET 3.5 auf IIS6 Generierung 401 "Unauthorized" Antworten gefolgt von 200 "Ok" Antworten (wie von Fiddler beschrieben). Ich bin mir bewusst, warum dies passiert (integrierte Auth zwingt den Browser, Anmeldeinformationen erneut zu senden), aber ich suche nach einigen Gedanken darüber, wie man die Situation minimieren oder ausmerzen kann. Die betreffende Anwendung wird im WAN ausgeführt, wobei einige Benutzer eine Latenz von bis zu 250 ms haben, sodass das Erzwingen einer nachfolgenden Anforderung einen merklichen Einfluss auf die Seitenladezeit haben kann, insbesondere wenn auf den Seiten eine Reihe von kaskadierenden Dropdown-Listen vorhanden sind.Eradikation 401 "Unauthorized" Antworten gefolgt von 200 "Ok" Antworten

Die Benutzer der Anwendung sind innerhalb einer verwalteten Desktopumgebung intern, sodass Mechanismen, die den Browser zwingen, Anmeldeinformationen bei der ersten Anforderung zu senden (ist dies sogar möglich?) Aus einer Bereitstellungsperspektive möglich sind. Dies würde für Seiten funktionieren, die die Identität des Benutzers erfordern, aber für Ressourcen, die keine Authentifizierung erfordern (WebResource.axd, ScriptResource.axd und einige benutzerdefinierte Webdienste), was eine anonyme Authentifizierung ermöglicht. Ich habe es pro Standort in der web.config betrachtet, aber die Ergebnisse waren gemischt (immer noch eine Anzahl von 401 Antworten).

Ich würde mich über jede Anleitung zu einer "Best Practice" im Umgang mit dieser Situation freuen. Es gibt eine Menge Ressourcen, die das Problem identifizieren, aber keine, die ich gefunden habe, die eine machbare Lösung bietet.

Danke!

Bearbeiten: Ressourcen, die keine Authentifizierung erfordern (d. H. Web-Services für kaskadierende Dropdown-Listen) können anonym durch Hinzufügen eines Standorteintrags zur Webkonfiguration angefordert werden, aber ich muss noch eine Antwort für authentifizierte Ressourcen finden.

+0

Welchen Browser verwenden sie? Die meisten Browser senden immer grundlegende http-Authentifizierungsdaten. Die Antwort hängt wahrscheinlich vom Browser ab. – recursive

+0

Der Browser ist IE6 mit einigen Benutzern, die jetzt zu IE7 migriert werden. –

Antwort

15

Leider ist dies ein Artefakt der HTTP NTLM authentication scheme zu vermeiden.

Kurz gesagt, der Browser (Internet Explorer oder anders) weiß nicht, dass es sich überhaupt authentifizieren muss, bis es mit einer 401-Antwort, die einen WWW-Authenticate Antwortheader enthält, zurückgewiesen wird.

Im Falle WWW-Authenticate: NTLM - ärgerlicherweise - es erfordert zwei 401 Antworten auf eine einzige persistente Verbindung zu vervollständigen, und dieser Prozess muss wiederholt werden, wenn die HTTP persistente Verbindung geschlossen ist. Selbst wenn Sie den Browser dazu bringen konnten, eine NTLM-Anfrage blindlings zu initiieren, kann mindestens eine 401-Antwort nicht aus der Transaktion entfernt werden.

Ich denke, Ihre beste Wette wäre, die Dauer zu maximieren, die persistente Verbindungen im Ruhezustand offen bleiben.

+0

Überprüfen Sie die IIS-Einstellungen. http://msdn.microsoft.com/en-us/library/aa347472.aspx Sie können mit diesen Einstellungen spielen, um 401 Anfragen zu reduzieren .. Seien Sie jedoch vorsichtig mit Ihrer Wahl .. AuthPersistNonNTLM, authPersistSingleRequest – batspy

0

Ich glaube, dass Sie Firefox davon überzeugen können, automatisch NTLM-Anmeldeinformationen über "about: config" -Einstellungen an eine Whitelist-Gruppe von Domänen zu senden - verwenden Sie die Einstellung "network.automatic-ntlm-auth.trusted-uris". Ich habe das selbst nicht versucht. Ich bin mir nicht sicher, ob es eine Entsprechung für Internet Explorer gibt.

Leider scheint es, wenn Sie etwas anderes wie Kerberos verwenden nicht einen Weg, um die 401.

+0

Danke BRH, leider ist die Abhängigkeit auf IE6 und 7 gesetzt. –

+2

Das Einstellen der 'network.automatic-ntlm-auth.trusted-uris' wie beschrieben ermöglicht es Firefox, sich zu authentifizieren, ohne den Benutzer nach den Domänenanmeldeinformationen zu fragen, tut es aber nicht löse das "Problem" des 401-401-200-Musters. Dies ist Teil der NTLM-Authentifizierung und wird unabhängig von den Browsereinstellungen immer ausgeführt. – hmqcnoesy

0

Möglicherweise müssen Sie die Formularauthentifizierung in Betracht ziehen, wenn die 401-induzierte Latenz zu lang ist. Die Benutzer müssten sich explizit anmelden, aber nur einmal. Dann könnten Sie ein Cookie oder ein Cookie-freies Schema verwenden und beim ersten Versuch eine Antwort erhalten.

Ich stelle mir vor, dass das Laden der Seite langsam wäre, wenn Sie kaskadierende Dropdown-Menüs haben und Ihre anfängliche Seitenauslastung einen Wert auffüllt, der einen POST zur nächsten Liste bringt, diesen Wert setzt, einen weiteren POST, um die nächste Liste zu erhalten. und so weiter.Wenn dies der Fall ist, müssen Sie möglicherweise alle diese Dropdown-Listen auf der ersten Rundreise füllen, anstatt auf POST-Antworten zu warten.

3

CSCRIPT.EXE c: \ inetpub \ Admin \ adsutil.vbs SET W3SVC/AuthPersistSingleRequest FALSCH

Wird die Menge von 401 ist deutlich zu reduzieren.