Gibt es eine Möglichkeit, die Anmeldeaufforderung des Browsers bei der 401-Antwort zu unterdrücken, wenn XmlHttpRequest verwendet wird

8

Ich benutze die Funktion jQuert .ajax, um eine Seitenmethode aufzurufen. Die Site verwendet FormsAuthentication. Wenn ein Authentifizierungsticket abläuft, führt ein Aufruf der Seitenmethode offensichtlich zu einer Umleitung auf die Anmeldeseite.

Nun haben die Genies, die das System.Web.Handlers.ScriptModule geschrieben haben, entschieden, dass, wenn aus irgendeinem Grund ein REST-Style-Aufruf an eine Page-Methode oder eine Web-Service-Methode von JavaScript eine 302 Redirect verursacht, sie nur gehen einfach die Antwort in eine 401 Unauthorized. Dies führt dazu, dass ein Browser eine Login-Oberfläche öffnet, die völlig irreführend ist, da der Benutzer versucht, seinen Benutzernamen und sein Passwort einzugeben, was nichts bedeutet, da FormsAuthentication verwendet wird. Wenn der Benutzer schließlich auf Abbrechen klickt, kommt der 401 zum Fehlerbehandler.

Die Frage ist also, wie kann man die Eingabeaufforderung für die Benutzerschnittstelle des Browsers in irgendeiner Weise deaktivieren? Einige Leute im Internet schlagen vor, einen Benutzernamen und ein Passwort in der XHR-Anfrage zu verwenden, aber es scheint nicht zu funktionieren.

    
Strelok 11.12.2008, 23:54
quelle

3 Antworten

5

Ich denke, ich habe daran gearbeitet. Natürlich auf interne MS AJAX bezogene Fehler zu verlassen, ist nicht wirklich nett, aber dies wird den Trick für andere Gesichter mit diesem Problem tun.

Wenn Sie den X-MicrosoftAjax Header auf den Wert Delta = true setzen (Fall ist hier wichtig), interpretiert das ScriptModule dies als a normale Umleitung, und die Antwort in eine 200 umwandeln, wird jedoch die pageRedirect -Datenzeichenfolge für jeden ScriptManager (MS-AJAX PageRequestManager) auf der Seite zu konsumieren. Die jQuery.ajax-Funktion sieht dies immer noch als Fehler. Sie können also in der responseText-Eigenschaft der XHR nach pageRedirect suchen und sie entsprechend bearbeiten. Wie den Benutzer auf die Anmeldeseite von etwas zu senden.

%Vor%     
Strelok 12.12.2008, 00:39
quelle
2

Dies kann in IIS deaktiviert werden. Die unten beschriebenen Details gelten für IIS6, aber es sollte nicht schwierig sein, die relevanten Elemente für IIS7 und höher zu finden.

  1. Suchen Sie die relevante Site.
  2. Öffnen Sie die Registerkarte "Verzeichnissicherheit" oder die entsprechende Registerkarte in Ihrer IIS-Version
  3. Klicken Sie auf "Bearbeiten" im Abschnitt "Authentifizierung und Zugriffskontrolle"
  4. Deaktivieren Sie "Integrierte Windows-Authentifizierung"

Sie sollten das Popup in Ihrem Browser nicht mehr sehen und die korrekten Statuscodes nach Ihren Wünschen zurücksenden können.

    
John_ 23.03.2012 10:02
quelle
1

Beide sind gute Antworten. Wenn Ihre Website jedoch auf einem gemeinsam genutzten Server gehostet wird, können Sie die IIS-Einstellungen wahrscheinlich nicht ändern, sodass die Lösung auf der Client-Seite rockt. Ich habe das selbe Problem gehabt, und dieser Posten rettet mich. Meine zwei Cent zur Lösung: In jquery (zumindest in den neuesten Versionen) können Sie einen Parameter namens "header" verwenden, um diese Header zu senden, ohne den "beforeSend" -Rückruf zu verwenden, und ich denke, dass dies ein etwas saubererer Weg sein kann, um dasselbe zu tun. Sie können hier auch andere Header-Informationen hinzufügen:

%Vor%

Ich kannte diesen Header "Delta = true" nicht und nach ein bisschen Forschung scheint es eine Kopfzeile zu sein, um dem Server mitzuteilen, dass die Anfrage, die Sie machen, eine asynchrone Postback-Anfrage ist.

Der AJAX-Aufruf wird einen HTTP-Status 200 (anstelle von "Nicht autorisiert" 401) im "Fehler" -Rückruf zurückgeben, was bedeutet, dass die Server-Anfrage in irgendeiner Weise erfolgreich war (obwohl Authentifizierung fehlschlägt). Ein bisschen seltsam, aber so funktioniert es.

Hoffe, das hilft.

    
tomasofen 12.04.2014 07:47
quelle