Wie wird eine zustandslose (sitzungslose) und keine Cookie-freie Authentifizierung durchgeführt?


107

Bob verwendet eine Webanwendung, um etwas zu erreichen. Und:

  • Sein Browser ist auf Diät, daher unterstützt er keine Cookies .
  • Die Webanwendung ist sehr beliebt, sie befasst sich zu einem bestimmten Zeitpunkt mit vielen Benutzern - sie muss gut skalierbar sein . Solange die Beibehaltung der Sitzung die Anzahl der gleichzeitigen Verbindungen begrenzen würde und natürlich eine nicht zu vernachlässigende Leistungseinbuße mit sich bringt , möchten wir möglicherweise ein sitzungsloses System haben :)

Einige wichtige Hinweise:

  • Wir haben Transportsicherheit ( HTTPS und seine besten Freunde);
  • Hinter den Kulissen delegiert die Webanwendung im Namen des aktuellen Benutzers viele Vorgänge an externe Dienste (diese Systeme erkennen Bob als einen ihrer Benutzer an). Dies bedeutet, dass wir ihnen die Anmeldeinformationen von Bob weiterleiten müssen .

Wie authentifizieren wir Bob (bei jeder Anfrage)? Was wäre ein vernünftiger Weg, um so etwas umzusetzen?

  • spielt Tennis mit den Anmeldeinformationen über HTML - Formular ausgeblendeten Felder ... die Kugel enthält die Anmeldeinformationen ( Benutzername und Passwort ) und die zwei Schläger sind der Browser und die Web - Anwendung ist. Mit anderen Worten, wir können Daten über Formularfelder anstatt über Cookies hin und her transportieren. Bei jeder Webanforderung veröffentlicht der Browser die Anmeldeinformationen. Im Fall einer einseitigen Anwendung kann dies jedoch so aussehen, als würde man Squash gegen eine Gummiwand spielen, anstatt Tennis zu spielen , da das Webformular mit den Anmeldeinformationen möglicherweise während der gesamten Lebensdauer der Webseite am Leben bleibt (und der Server wird so konfiguriert, dass die Anmeldeinformationen nicht zurückgegeben werden).
  • Speichern des Benutzernamens und des Passworts im Kontext der Seite - JavaScript-Variablen usw. Hier ist eine einzelne Seite erforderlich, IMHO.
  • verschlüsselte tokenbasierte Authentifizierung. In diesem Fall würde die Anmeldeaktion zur Generierung eines verschlüsselten Sicherheitstokens (Benutzername + Kennwort + etwas anderes) führen. Dieses Token wird dem Client zurückgesandt, und die anstehenden Anforderungen werden von dem Token begleitet. Macht das Sinn? Wir haben bereits HTTPS ...
  • Andere...
  • letzter Ausweg: Tun Sie dies nicht, speichern Sie Anmeldeinformationen in der Sitzung! Die Sitzung ist gut. Mit oder ohne Cookies.

Denken Sie an Web- / Sicherheitsbedenken in Bezug auf eine der zuvor beschriebenen Ideen? Beispielsweise,

  • Zeitüberschreitung - Möglicherweise behalten wir einen Zeitstempel zusammen mit den Anmeldeinformationen bei (Zeitstempel = die Zeit, zu der Bob seine Anmeldeinformationen eingegeben hat). Wenn beispielsweise JETZT - Zeitstempel> Schwellenwert , wird die Anforderung möglicherweise abgelehnt.
  • Cross-Site-Scripting- Schutz - sollte in keiner Weise anders sein, oder?

Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu lesen :)


1
Sie können jeder URL ein Token anhängen. ASP.NET verfügt dazu über einen (Legacy-) Modus. Dies beweist, dass es funktionieren kann.
usr

1
Wo sind alle? :)
Turdus-Merula

2
Ich denke, Sie haben eine ziemlich gute Vorstellung von den verfügbaren Optionen. Vertrauen Sie Ihrer Argumentation und entscheiden Sie selbst.
usr

Ist ein Plugin wie Silverlight of Flash eine Option?
Giu

@usr nicht sicher, ob es eine gute Idee ist, als ob ein Hacker, der zu Ihren Websever-Protokollen gelangt, Ihr Token stehlen und sich in Ihrem System anmelden kann.
GibboK

Antworten:


74

Ah, ich liebe diese Fragen - eine Sitzung ohne Sitzung aufrechtzuerhalten.

Ich habe während meiner Aufenthalte bei der Beurteilung von Bewerbungen mehrere Möglichkeiten gesehen, dies zu tun. Eine der beliebtesten Möglichkeiten ist die von Ihnen erwähnte Art, Tennis zu spielen. Bei jeder Anfrage zur Authentifizierung des Benutzers werden der Benutzername und das Passwort gesendet. Dies ist meiner Meinung nach unsicher, insbesondere wenn die Anwendung keine einzelne Seite ist. Es ist auch nicht skalierbar, insbesondere wenn Sie Ihrer App in Zukunft zusätzlich zur Authentifizierung eine Autorisierung hinzufügen möchten (obwohl Sie wahrscheinlich auch etwas basierend auf Anmeldungen erstellen könnten).

Ein beliebter, wenn auch nicht vollständig zustandsloser Mechanismus (vorausgesetzt, Sie haben JavaScript-Ausführung) ist das Einbetten des Sitzungscookies in JavaScript. Der Sicherheitsmann in mir schreit darüber, aber es könnte tatsächlich funktionieren - jede Anfrage hat eineX-Authentication-TokenHeader oder ähnliches, und Sie ordnen das einer Datenbank, einem Dateispeicher im Speicher usw. im Backend zu, um den Benutzer zu validieren. Dieses Token kann eine Zeitüberschreitung haben, unabhängig von der von Ihnen angegebenen Zeit. Wenn das Zeitlimit überschritten wird, muss sich der Benutzer erneut anmelden. Es ist ziemlich skalierbar - wenn Sie es in einer Datenbank speichern, eine SQL-Anweisung ausführen und die richtigen Indizes verwenden, sollte die Ausführung selbst bei mehreren gleichzeitigen Benutzern sehr wenig Zeit in Anspruch nehmen. Lasttests hier würden jedoch definitiv helfen. Wenn ich die Frage richtig lese, ist dies Ihr verschlüsselter Token-Mechanismus. Ich würde jedoch dringend empfehlen, ein kryptografisch zufälliges Token mit beispielsweise 32 Zeichen zu verwenden, anstatt eine Kombination aus Benutzername + Passwort + was auch immer zu verwenden unvorhersehbar, aber Sie können es trotzdem mit der Benutzer-ID oder Ähnlichem verknüpfen.

Was auch immer Sie letztendlich verwenden, stellen Sie sicher, dass es sicher an Sie gesendet wird. HTTPS schützt Sie über das Kabel, aber nicht, wenn Sie das Sitzungstoken über die URL (oder schlimmer noch, Anmeldeinformationen über die URL) verlieren. Ich würde empfehlen, einen Header zu verwenden oder, wenn dies nicht möglich ist, das Token jedes Mal über eine POST-Anfrage zu senden (dies würde ein ausgeblendetes Formularfeld im Browser des Benutzers bedeuten). Der letztere Ansatz der Verwendung einer POST-Anfrage sollte nur CSRF-Abwehr verwenden für den Fall, obwohl ich vermute, dass die Verwendung des Tokens selbst eine Art CSRF-Verteidigung sein könnte.

Stellen Sie zu guter Letzt sicher, dass Sie im Backend einen Mechanismus zum Löschen abgelaufener Token haben. Dies war in der Vergangenheit der Fluch vieler Anwendungen - eine schnell wachsende Datenbank von Authentifizierungstoken, die scheinbar nie verschwindet. Wenn Sie mehrere Benutzeranmeldungen unterstützen müssen, stellen Sie sicher, dass Sie entweder die Anzahl begrenzen oder für jedes Token ein kürzeres Zeitlimit haben. Wie ich bereits sagte, können Lasttests die Antwort darauf sein.

Es gibt einige andere Sicherheitsbedenken, an die ich denken kann, die jedoch zu weit gefasst sind, um in dieser Phase angegangen zu werden. Wenn Sie alle Fälle von Verwendung (und Missbrauch) berücksichtigen, sollten Sie wahrscheinlich in der Lage sein, eine ziemlich gute Implementierung durchzuführen dieses System.


Können Sie nicht das tun, was das Play Framework tut, und dem Benutzer ein signiertes Cookie senden? Haben Sie dann dieses Cookie für jede nachfolgende Anforderung an den Server zurückgesendet?
J wird

8
> Sein Browser ist auf Diät, daher unterstützt er keine Cookies.
Karthik Rangarajan

4
Sind diese Vorschläge tatsächlich zustandslos / sitzungslos ? Von Ihren fünf Hauptabschnitten (ab der Ausgabe 2013-12-19 des Beitrags): # 1 ist einleitend, # 2 schlägt besonders kludgy Web2.0 ™ -geschmackte Sitzungen vor, # 3 ist nur Ermahnung, # 4 diskutiert die Auswirkungen von Statefulness , und # 5 ist ein vages Outro ... wie wurde dies akzeptiert? Es ist bestenfalls tangential informativ!
JamesTheAwesomeDude

1

Über die Anmeldeoption - Ich denke, dass Sie normalerweise Sitzungen auch für Gäste unterstützen möchten.

Wenn Sie also die Anmeldung erzwingen möchten, ist die Option für verschlüsselte Token möglicherweise gut. Es könnte auch irgendwie für die Gastsitzung gut sein. In einer anderen Richtung würde ich das Anhängen des Tokens an die URL und die Tennisoption kombinieren.

Beachten Sie, dass das Senden von Anmeldeinformationen nur in der URL gefährlich sein kann. Beispielsweise können Sie das Token über den HTTP-Referer-Header oder sogar von jemandem verlieren, der nur Ihren Datenverkehr überprüft oder Ihren Computer überwacht.

Selbst wenn Sie Cookies verwenden könnten, würde ich Ihnen empfehlen, zufällige Token oder zufällige Verifer hinzuzufügen, um sich vor CSRF-Angriffen (Cross Site Request Forgery) zu schützen.


3
Eine Sitzung ist ein Status, der auf dem Server gespeichert ist. Die Frage fragt nach einer zustandslosen Authentifizierung.
Kwebble
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.