2009-11-17 12 views
93

Die Anwendung, an der ich gerade arbeite, hat einen Session-Timeout-Wert. Wenn der Benutzer nicht länger als diesen Wert interagiert hat, wird er aufgefordert, sich einzuloggen.HTTP 401 - Was ist ein geeigneter WWW-Authenticate-Header-Wert?

Alle Anforderungen werden über diesen Mechanismus weitergeleitet, der AJAX-Aufrufe enthält. Ursprünglich haben wir einen 200-Header mit der Anmeldeseite gesendet, was einige Probleme mit AJAX verursacht, da Code ausgeführt wird, wenn eine 200-Antwort gesendet wird, und die meisten Daten von diesen RPC-Aufrufen sind JSON- oder Raw-JavaScript, das ausgewertet wird (do not frage: |).

Ich habe vorgeschlagen, dass ein 401 ist besser, da unser JSON-Parser eine HTML-Anmeldeseite verbrauchen nicht versuchen, .. :)

Wenn reading the spec ich jedoch, dass das Feld WWW-Authenticate bemerkt muss auch gesendet werden.

Was ist ein guter Wert für dieses Feld? Wird Application Login ausreichen?

Antwort

58

Wenn HTTP-Basic-Authentifizierung angibt, kehren wir so etwas wie:

WWW-Authenticate: Basic realm="myRealm" 

Während Basic ist die Regelung und der Rest ist sehr stark abhängig von dieser Regelung. In diesem Fall stellt der Realm dem Browser lediglich ein Literal zur Verfügung, das dem Benutzer angezeigt werden kann, wenn er nach der Benutzer-ID und dem Passwort fragt.

Sie verwenden offensichtlich nicht einfach aber da es keinen Sinn Sitzung Ablauf aufweist, ist, wenn Basis-Auth verwendet wird. Ich nehme an, dass Sie eine Form der formularbasierten Authentifizierung verwenden.

Von Erinnerung, Windows Challenge Response verwendet ein anderes Schema und andere Argumente.

Der Trick ist, dass es an den Browser ist zu bestimmen, welche Systeme unterstützt und wie sie darauf reagiert.

Mein Gefühl, wenn Sie formularbasierte Authentifizierung verwenden, ist es, bei der 200 + Relogin-Seite zu bleiben, aber einen benutzerdefinierten Header hinzuzufügen, den der Browser ignoriert, aber Ihr AJAX identifizieren kann.

Für ein wirklich gutes Benutzer + AJAX-Erlebnis, erhalten Sie das Skript, um an der AJAX-Anfrage zu hängen, die Sitzung abgelaufen gefunden, eine erneute Anmeldung Anfrage über ein Popup auslösen, und bei Erfolg, die ursprüngliche AJAX-Anfrage erneut und weitermachen wie normal.

den Cheat vermeiden, die gerade das Skript bekommt die Website alle 5 Minuten treffen die Sitzung am Leben Ursache zu halten, die den Punkt der Sitzung Ablauf besiegt gerade.

Die andere Alternative ist brennen die AJAX-Anfrage, aber das ist eine schlechte Benutzererfahrung.

+1

Dank Kumpel, ich bin jetzt eine 403 anstatt verwenden, da es nicht eine Umleitung ist und es enthält buchstäblich das Login-Formular anstelle der Originalseite. Es entspricht auch besser der W3-Spezifikation. Danke für die Informationen jedoch. –

+2

Finden Sie diese Antwort darüber, wie Sie HTTP 401 weiterhin verwenden können: http://stackoverflow.com/questions/928874/how-doi-i-keep-firefox-from-prompting-for-username-password-with-http-basic -auth/19102200 # 19102200 – lanoxx

+0

Ja, leg einfach alles in den WWW-Authenticate-Header. Eine andere Antwort in ähnlicher Weise ist http://stackoverflow.com/a/1088127/689161 Oder einfach die Spezifikation zu verletzen und nicht die Header senden (zumindest ein paar Websites tun dies); 401 ist immer noch passender als 403. – gengkev

-3

Wenn die Benutzersitzung abläuft, sende ich einen HTTP 204-Statuscode zurück. Beachten Sie, dass der Status HTTP 204 keinen Inhalt enthält.Auf der Client-Seite kann ich dies:

xhr.send(null); 
if (xhr.status == 204) 
    Reload(); 
else 
    dropdown.innerHTML = xhr.responseText; 

Hier ist die Reload() Funktion:

function Reload() { 
    var oForm = document.createElement("form"); 
    document.body.appendChild(oForm); 
    oForm.submit(); 
    } 
+2

Wie kommt es, dass Sie HTTP 204 verwenden? https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204 –

Verwandte Themen