HTTP 401 - Was ist ein geeigneter WWW-Authenticate-Headerwert?

109

Die Anwendung, an der ich gerade arbeite, hat einen Sitzungszeitlimitwert. Wenn der Benutzer länger als dieser Wert nicht interagiert hat, wird er auf der nächsten Seite, die er zu laden versucht, aufgefordert, sich anzumelden.

Alle gestellten 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, die von diesen RPC-Aufrufen zurückgesendet werden, JSON oder unformatiertes JavaScript sind, das ausgewertet wird (nicht fragen: |).

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

Beim Lesen der Spezifikation bemerkte ich jedoch, dass dieWWW-Authenticate Feld auch gesendet werden muss.

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

Will Morgan
quelle

Antworten:

67

Wenn Sie die HTTP-Basisauthentifizierung angeben, geben wir Folgendes zurück:

WWW-Authenticate: Basic realm="myRealm"

Während Basicdie Regelung und der Rest ist sehr stark abhängig von dieser Regelung. In diesem Fall stellt Realm dem Browser lediglich ein Literal zur Verfügung, das dem Benutzer angezeigt werden kann, wenn er zur Eingabe der Benutzer-ID und des Kennworts aufgefordert wird.

Sie verwenden Basic jedoch offensichtlich nicht, da es keinen Sinn macht, die Sitzung ablaufen zu lassen, wenn Basic Auth verwendet wird. Ich gehe davon aus, dass Sie eine formularbasierte Authentifizierung verwenden.

Aus der Erinnerung heraus verwendet Windows Challenge Response ein anderes Schema und andere Argumente.

Der Trick besteht darin, dass es Sache des Browsers ist, zu bestimmen, welche Schemata er unterstützt und wie er darauf reagiert.

Mein Bauchgefühl, wenn Sie eine formularbasierte Authentifizierung verwenden, besteht darin, bei der Neuanmeldeseite über 200 zu bleiben, aber einen benutzerdefinierten Header hinzuzufügen, den der Browser ignoriert, den Ihr AJAX jedoch identifizieren kann.

Lassen Sie das Skript für eine wirklich gute Benutzer- und AJAX-Erfahrung an der AJAX-Anforderung festhalten, bei der die Sitzung abgelaufen ist, lösen Sie eine erneute Anmeldeanforderung über ein Popup aus und senden Sie bei Erfolg die ursprüngliche AJAX-Anforderung erneut und fahren Sie wie gewohnt fort.

Vermeiden Sie den Cheat, bei dem das Skript alle 5 Minuten auf die Site gelangt, um die Sitzung am Leben zu erhalten, da dies nur den Punkt des Sitzungsablaufs zunichte macht.

Die andere Alternative ist das Brennen der AJAX-Anforderung, aber das ist eine schlechte Benutzererfahrung.

Swanny
quelle
2
Vielen Dank, Kumpel, ich verwende jetzt stattdessen eine 403, da es sich nicht um eine Weiterleitung handelt und das Anmeldeformular anstelle der Originalseite buchstäblich enthalten ist. Es entspricht auch besser der W3-Spezifikation. Vielen Dank für die Informationen.
Will Morgan
2
Sehen Sie diese Antwort darüber, wie Sie HTTP 401 noch verwenden können: stackoverflow.com/questions/928874/…
lanoxx
Ja, nehmen Sie einfach etwas in den WWW-Authenticate-Header ein, nehme ich an. Eine andere Antwort in ähnlicher Weise lautet stackoverflow.com/a/1088127/689161. Oder verstoßen Sie einfach gegen die Spezifikation und senden Sie den Header nicht (zumindest einige Websites tun dies). 401 ist immer noch angemessener als 403.
Gengkev
Ich bin nicht sicher, ob ich "einfach irgendetwas" in den WWW-Authenticate-Header einfügen würde, da ich nicht sicher sein kann, ob die Anfrage von meinem Ajax oder dem Browser bearbeitet wird. Über den Titel dieser Frage hinaus würde ich angesichts der Details, die eine formularbasierte Authentifizierung vorschlagen, überhaupt keinen WWW-Authenticate-Header senden. Dies liegt daran, dass ich den Browser nicht auffordere, an der Authentifizierungs- / Anmeldeinformations-Herausforderung teilzunehmen. Ich möchte nur, dass ein Formular angezeigt wird, das zufällig ein Anmeldeformular ist, aber mit etwas, das der Ajax verwenden kann, um es zu identifizieren, handelt es sich um ein Anmeldeformular, sodass es anders als oben behandelt werden kann.
Swanny
Sie sollten ein Authn-Schema erstellen, das mit dem Header verwendet werden soll. Dann wird der Browser nicht involviert, weil er das Schema nicht versteht. Einige Clients sind verärgert oder verwirrt, wenn Sie den Header nicht einfügen.
KayEss
-7

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

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

Hier ist die Funktion Reload ():

function Reload() {
    var oForm = document.createElement("form");
    document.body.appendChild(oForm);
    oForm.submit();
    }
Schmurren
quelle
6
Wie kommt es, dass Sie HTTP 204 verwenden? developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
Will Morgan