Logins and Redirects: Was ist der beste HTTP-Flow für eine Webapp-Anmeldung?

8

Diese Frage ist eine Frage zu Login-Flows für Web-Apps im Allgemeinen. Ich bin am meisten an Antworten interessiert, die auf Benutzerfreundlichkeit und Leistung bei gleichzeitiger Aufrechterhaltung der Sicherheit optimieren.

Was ist die geeignetste Methode, um nicht authentifizierte Anfragen an Lesezeichen mit URLs zu bearbeiten?

Um das Problem zu veranschaulichen, sind hier einige Routen und entsprechende Verhaltensweisen für eine Beispielanwendung:

%Vor%

Option 1: Anzeige des Anmeldebildschirms, Weiterleitung zur gewünschten Seite

  1. Der Benutzer klickt auf das Lesezeichen
  2. GET / geheim - & gt; 200, zeigen Sie heimlich Anmeldeformular mit verstecktes Feld path="/ secret"
  3. an
  4. POST / processLogin - & gt; 302 to / secret (Wert des Pfadparameters)
  5. GET / geheim - & gt; 200, geheime Ressource angezeigt

Analyse: Hoffentlich ist Ihr Client ein moderner Browser, der nicht mit HTTP kompatibel ist, so dass er nach einem 302'd POST ein GET ausführt. Dies gilt für alle Bereiche. Sollte ich mir Sorgen machen?

Option 2: Zum Login-Bildschirm umleiten, Weiterleitung zur gewünschten Seite

  1. Der Benutzer klickt auf das Lesezeichen
  2. GET / geheim - & gt; 302 zu / login
  3. GET / Login über Weiterleitung - & gt; 200, Login-Formular mit versteckten Feld angezeigt path="/ secret"
  4. POST / processLogin - & gt; 302 zu / geheim
  5. GET / geheim - & gt; 200, geheime Ressource angezeigt

Analyse: Gleiche Probleme wie oben. Es wurde ein Problem hinzugefügt, dass die URL, die vom Browser während der Anmeldung angezeigt wird, sich ändert, was für den Benutzer verwirrend ist und Lesezeichen, Link-Sharing usw. unterbricht.

Option 3: Anmeldebildschirm anzeigen, gewünschte Seite anzeigen

  1. Der Benutzer klickt auf das Lesezeichen
  2. GET / geheim - & gt; 200, zeige heimlich Anmeldeformular mit action ="/ secret"
  3. an
  4. POST / geheim - & gt; 200, geheime Ressource angezeigt

Analyse: Leider ist die Aktualisierungsschaltfläche jetzt ebenfalls kaputt: Die Aktualisierung führt dazu, dass der Benutzeragent mit einer Warnung erneut sendet, anstatt erneut zu holen / geheim. Der Benutzer erhält eine Warnung, aber wenn er sie ignoriert, passiert etwas Schlimmes.

Auf der hellen Seite minimieren Sie Rundreisen mit dieser Technik.

Option 4: Zum Anmeldebildschirm umleiten, gewünschte Seite anzeigen

  1. Der Benutzer klickt auf das Lesezeichen
  2. GET / geheim - & gt; 302 an / processLogin
  3. GET / processLogin über Redirect - & gt; 200, Login-Formular angezeigt mit Aktion ="/ secret"
  4. POST / geheim - & gt; 302 zu / geheim
  5. GET / geheim - & gt; 200, geheime Ressource angezeigt

Analyse: Gleiche Probleme wie Optionen 2 + 4.

Option 5: ???

Gibt es eine andere Technik, die ich vermisse?

Welche der folgenden Techniken würden Sie generell empfehlen?

Siehe auch

Was ist der korrekte HTTP-Status? Code beim Umleiten auf eine Login-Seite? Welche Art von HTTP-Umleitung für Anmeldungen? HTTP-Antwort mit Umleitung, aber ohne Roundtrip?

    
mickeyreiss 26.02.2013, 23:40
quelle

5 Antworten

4

Option 1 & amp; 3 folgen nicht dem HTTP-RFC als "heimlich angezeigtes Anmeldeformular" widerspricht 200 GET-Antwort, wobei "eine Entität entspricht an die angeforderte Ressource gesendet wird in der Antwort "wird erwartet.

Option 2 ist OK. Alle modernen Browser unterstützen 302 auf POST und viele REST-basierte Frameworks (wie RoR) nutzen es aktiv. Alternativ können Sie in "302 to / login" bereits die Sitzung (Cookie) erstellen und die URL in Sitzung speichern, um zu vermeiden, dass die ursprüngliche URL in GET-Parametern übergeben wird. Aus Usability-Sicht können Sie auch eine entsprechende Nachricht auf der Anmeldeseite haben (ich denke, der URL-Mismatch ist hier irrelevant - Sie können den Benutzer den Inhalt sowieso nicht sehen lassen).

Option 4: Wenn Sie POST an / secret senden, erwartet HTTP RFC, dass Sie "die in der Anfrage eingeschlossene Entität als neuen Untergebenen der durch den Request-URI in der Request-Line identifizierten Ressource akzeptieren", aber alles, was Sie sind Das heißt, sich anzumelden und nichts Neues unter / secret zu erstellen.

Nach HTTP-RFC ist Ihre beste Wahl Option 2 . Tatsächlich stimmt Option 2 auch mit dem POST- & gt; Redirect- & gt; GET-Entwurfsmuster überein, das hilft um das Problem der Unvorhersehbarkeit von URL-Lesezeichen für POST-Ressourcen zu beheben.

    
Anton 14.03.2013, 09:39
quelle
3

Mein $ .02: Ich habe vor kurzem die Option 2 implementiert (obwohl ich /secret in einer Sitzung gespeichert habe, nicht im Login-Formular als verstecktes Feld).

Ich teile Ihre Bedenken nicht vollständig:

  

Problem hinzugefügt, dass die URL angezeigt wurde   durch den Browser bei der Anmeldung Änderungen, die für den Benutzer verwirrend ist   und bricht Lesezeichen, Linkfreigabe, etc.

Die Weiterleitung an /login und die anschließende Änderung der URL weist den Benutzer an, dass bevor er fortfahren kann, noch etwas anderes getan werden muss: Anmelden.

Da sich eine Anmeldeseite von der "Zielseite" völlig unterscheidet, kann ich nicht erkennen, dass dies dazu führt, dass Nutzer die Anmeldeseite anstelle der Zielseite mit Lesezeichen verknüpfen und / oder die Anmeldeseite teilen. t die Informationen enthalten, die sie trotzdem als Lesezeichen / Freigaben verwenden möchten.

Und wenn Sie sich Sorgen machen, dass 302 den Standard bricht (obwohl jeder einzelne Browser, den ich kenne, es gerne bricht), sollten Sie stattdessen 303 verwenden.

    
robertklep 09.03.2013 15:23
quelle
1

Beachten Sie, dass mickeyreiss korrekt ist, die Verwendung von AJAX Option 3 funktioniert ohne den Nachteil der abgebrochenen Schaltfläche. Dies bedeutet jedoch, dass der Benutzer JavaScript aktiviert haben muss. Wenn Sie Ihr Formular richtig programmieren, können Sie feststellen, ob JS vorhanden ist, falls nicht, verwenden Sie Option 1.

Beachten Sie, dass die 302-Antwort in Ordnung ist, aber möglicherweise Probleme mit Caches haben. Sie müssen sicherstellen, dass nichts zwischengespeichert wird, wenn Sie zwei völlig verschiedene Seiten / Formulare für denselben URI anzeigen möchten. (/ secret zeigt den Login und dann das eigentliche Geheimnis an.)

    
Alexis Wilke 09.03.2013 11:01
quelle
1

Ich verwende fast immer Option # 2, einfach weil der von einer URL zurückgegebene Inhalt konsistent ist. Während die Geheimnisse von heute hinter einem Login versteckt sind, möchten Sie es vielleicht morgen öffnen oder gemischt public / secret anzeigen, abhängig von der Authentifizierung unter der gleichen URL. In diesem Fall wird Option 2 am ehesten den Erwartungen von Google entsprechen. Alle Content-Köder und -Switches werden von Google abgelehnt und im Extremfall haben alle Ihre Seiten doppelte Seiteninhalte (zB Login-Formular).

    
kilsek 14.03.2013 19:09
quelle
0

Ich würde die Option mit AJAX wählen:

  1. Login-Seite und verstecke den Inhalt
  2. Der Benutzer gibt den Benutzernamen und das Passwort ein.
  3. Die Authentifizierung erfolgt serverseitig.
  4. Der Server gibt ein Ergebnis zurück
  5. Wenn Sie erfolgreich sind, verwenden Sie location.href , um die gewünschte Seite festzulegen Gehe zu, sonst kannst du eine Nachricht ausgeben, die besagt, dass die Anmeldung nicht erfolgt gültig.
  6. In Ihrem Server werden Sie auf einer _SESSION Variable testen, wenn nicht auf die Anmeldeseite umgeleitet wird ..
Mehdi Karamosly 14.03.2013 19:05
quelle