Frage:
Der beste Ort zum Speichern von Authentifizierungs-Token auf der Clientseite
jfamvg
2015-02-03 15:45:20 UTC
view on stackexchange narkive permalink

Wenn meine Benutzer authentifiziert sind, erhalten sie ein Authentifizierungstoken. Ich muss dieses Authentifizierungstoken verwenden, um einige asp.net-WebAPI-Aufrufe zu autorisieren. Dazu muss ich das Token zum Kopf dieses Aufrufs hinzufügen, sodass ich das Token benötige, auf das über den Browser des Benutzers zugegriffen werden kann. Ich denke, dass das Speichern des Tokens in einem Cookie nicht der sicherste Weg ist. Was ist also der sicherste Weg, diesen Token zu speichern und trotzdem in meinem Javascript zugänglich zu sein, um API-Aufrufe durchzuführen?

http://ceur-ws.org/Vol-313/paper9.pdf Bitte lesen Sie dies. Wenn Sie versuchen, etwas gegen Best Practice zu implementieren, das nicht generisch ist. Dann werden Sie später Probleme haben, Ihren Kunden zu unterstützen.
Ich denke, die Verwendung von SSL-Zertifikaten sollte Ihre Arbeit erledigen. Dort finden Sie Veröffentlichungen, in denen ihre Verwendung und ihre Funktionsweise erläutert werden: http://www.rfc-base.org/rfc-6101.html.
Inwiefern hilft SSL dabei, ein auf dem Client gespeichertes Token zu sichern?
Sitzungscookie. Überdenken Sie es nicht, diese Dinge wurden aus einem bestimmten Grund gemacht.
"Ich denke das ..." Wenn der Rest der Welt auf Cookies angewiesen ist, um solche Token zu speichern, sollten Sie vielleicht Ihr Denken erklären, damit wir alle besser informiert sind und die Chance haben, eine Lösung zu finden, die Ihre Bedenken berücksichtigt?
Sechs antworten:
Chris Clark
2015-02-03 21:22:55 UTC
view on stackexchange narkive permalink

Es gibt zwei Möglichkeiten, Authentifizierungsinformationen im Browser zu speichern:

  1. Cookies
  2. HTML5-Webspeicher
  3. ol>

    In jedem In diesem Fall müssen Sie darauf vertrauen, dass die Browser korrekt implementiert sind und dass Website A nicht auf die Authentifizierungsinformationen für Website B zugreifen kann. In diesem Sinne sind beide Speichermechanismen gleich sicher. Es können jedoch Probleme hinsichtlich der Verwendung auftreten.

    Wenn Sie Cookies verwenden:

  • Der Browser sendet die Authentifizierungsinformationen bei jeder Anforderung automatisch an die API. Dies kann praktisch sein, solange Sie wissen, dass es passiert.
  • Sie müssen sich daran erinnern, dass CSRF eine Sache ist, und sich damit befassen.

Wenn Sie HTML5 Web verwenden Speicher:

  • Sie müssen Javascript schreiben, das genau verwaltet, wann und welche Authentifizierungsinformationen gesendet werden.

Der große Unterschied, den die Leute interessieren, ist der bei Cookies. Sie müssen sich um CSRF sorgen. Um CSRF richtig zu handhaben, benötigen Sie normalerweise ein zusätzliches "Synchronizer-Token".

All-in-One-Webframeworks (wie Grails, Rails, wahrscheinlich asp.net) bieten normalerweise ein Einfache Möglichkeit, den CSRF-Schutz zu aktivieren und automatisch Synchronizer-Token in Ihre Benutzeroberfläche einzufügen. Wenn Sie jedoch eine Benutzeroberfläche mit einem clientseitigen Webframework (wie AngularJS oder BackboneJS) schreiben, müssen Sie Javascript schreiben, um das Synchronisierungstoken zu verwalten. In diesem Fall können Sie sich genauso gut für den HTML5-Webspeicher-Ansatz entscheiden und sich nur um ein Token kümmern.

Einige andere Unterschiede werden hier erläutert.

Bearbeiten Eine Google-Suche zeigt dies für asp.net an. Das Synchronisierungstoken wird als "Anforderungsüberprüfungstoken" bezeichnet.

James
2015-02-03 16:39:52 UTC
view on stackexchange narkive permalink

Der beste Weg, um Ihr Zugriffstoken zu schützen, besteht darin, es überhaupt nicht clientseitig zu speichern.

Wie funktioniert das? Generieren Sie zum Zeitpunkt des Generierens des Zugriffstokens ein anderes kryptografisch sicheres PRNG (das Sie dem Zugriffstoken auf dem Server zuordnen), ordnen Sie dies der Sitzungs-ID des Benutzers zu und geben Sie es stattdessen an den Client zurück

Dadurch wird der Angriffsbereich verkleinert, da Sie jetzt ein an eine Sitzung gebundenes Token zurückgeben und beide erforderlich sind, um das Token zu autorisieren. Wenn die Sitzung abläuft, wird das Token natürlich auch neu erstellt, und der Benutzer muss sich erneut authentifizieren, wodurch ein neues Zugriffstoken generiert wird.

Es ist immer noch nicht 100% sicher, Sie müssen jedoch das Token abwägen Möglichkeit, dass so etwas innerhalb einer Benutzersitzung passiert. Auf dieser Grundlage können Sie dann die Ablaufzeiten Ihrer Sitzung / Ihres Tokens an Ihre Bedürfnisse anpassen. Sie müssen jedoch auch auf die Benutzerfreundlichkeit achten. Sie möchten keine Sitzungen nach 5 Minuten ablaufen lassen, da es mühsam sein kann, sich ständig wieder anzumelden ( oder vielleicht können Sie, abhängig von der Art der Anwendung).

Vielen Dank für Ihre Antwort, aber ich muss das Token in den Header meines AJAX-API-Aufrufs aufnehmen, damit das vollständige Token in meinem Javascript verfügbar ist.
@jfamvg Ich schlage nicht vor, dass Sie * kein * Token auf dem Client speichern. Ich sage, dass Sie das * private * Zugriffstoken dort nicht speichern. Generieren Sie ein öffentliches Token und senden Sie es stattdessen.
Ich muss das Literal-Token an die WebAPI senden, daher muss ich einen zusätzlichen Aufruf an den Server senden, damit das Token aus dem privaten Token stammt, um es an meine WebAPI zu senden.
Ich verstehe den Unterschied zwischen einem öffentlichen und einem privaten Token nicht.In OAuth ist ein Token ein Token.Wenn Sie damit eine Anfrage an WebAPI stellen können, welchen Schutz bieten Sie dann hier an?Gehen Sie davon aus, dass das Token einige Informationen enthält, die geschützt werden müssen?Wenn Sie den OAuth-Anbieter von Katana verwenden, werden die Ansprüche, aus denen sich das Token zusammensetzt, verschlüsselt.
@EdGreaves war vor einiger Zeit, aber basierend auf der Frage wurde angenommen, dass der Benutzer ein "sensibles" Token hatte, das er nicht gerne auf dem Client speichern wollte.Mein Vorschlag war, das Token einfach nicht clientseitig zu speichern, wenn dies der Fall ist, sondern einen öffentlichen Schlüssel zu speichern, der einem privaten Schlüssel auf dem Server zugeordnet werden könnte.Sollte der öffentliche Schlüssel jemals kompromittiert werden, besteht keine Gefahr, dass interne Daten verloren gehen.Sie haben natürlich immer noch das Problem, dass der Schlüssel für böswillige Zwecke verwendet werden könnte, aber das ist ein ganz anderes Problem.
@James Ist das dann nicht nur eine Sitzung?Was bringt es, das Token auf dem Server zu speichern und auf der Clientseite einen Schlüssel / eine ID zu haben, um darauf zu verweisen?
Ist ein Zugriffstoken nicht nur eine kryptografisch sichere Zufälligkeit?
@LazarLjubenović gut, dass alles davon abhängt, wie das Token generiert wird, wenn Sie Dienste wie OAuth usw. verwenden, dann können Sie so ziemlich garantieren, dass das zurückkommende Token sicher ist, auf dem Client gespeichert zu werden (bis zu einem gewissen Grad).
Paul Mooney
2015-10-02 18:10:47 UTC
view on stackexchange narkive permalink

ARMOR wurde speziell für diese Anforderung entwickelt. Das Anti-Fälschungs-Token kann an einer beliebigen Stelle auf der Benutzeroberfläche gespeichert werden, die Sie für richtig halten. Die Bibliothek ist mit einer benutzerdefinierten JavaScript-Komponente ausgestattet, die das Token aus der Benutzeroberfläche extrahiert und automatisch in AJAX-Header einfügt.

Hier ist ein Tutorial zu diesem Thema und Hier ist das GitHub-Repo.

fox
2020-01-02 15:59:19 UTC
view on stackexchange narkive permalink

Ich würde das Token in einem Cookie mit den folgenden drei Flags speichern: 1. Sicher: Über https2 übertragen. HttpOnly: clientseitiges JS kann es nicht lesen (XSS-Schutz) 3. SameSite (entweder Lax oder Strict): CSRF-Schutz

Auf diese Weise sind Sie immun gegen XSS und CSRF. Sie müssen nur vorsichtig mit SameSite sein, da es relativ neu ist und erst kürzlich von den 4 wichtigsten Browsern (Chrome, FF, Safari, Edge) unterstützt wurde. Siehe: https://caniuse.com/#feat=same -site-cookie-attribute

Weitere Informationen zum Härten von Cookies finden Sie unter https://odino.org/security-hardening-http-cookies/

zono
2015-10-21 04:51:03 UTC
view on stackexchange narkive permalink

Alex 'Blog muss informativ sein.

Ein Server stirbt jedes Mal, wenn jemand OAuth auf einer einzelnen Seite als Web-App implementiert. Stoppen Sie den Völkermord! Verwenden Sie einen serverseitigen Proxy! Handeln Sie jetzt!

https://github.com/alexbilbie/alexbilbie.github.com/blob/master/_posts/2014-11-11-oauth-and-javascript .md

Die in diesem Artikel vorgeschlagene Lösung scheint nicht hilfreich zu sein. Angenommen, der Angreifer hat Zugriff auf den Clientstatus eines Benutzers (Token, Cookies usw.), kann der Angreifer einfach dieselbe Anforderung an den Proxyserver senden: `GET / ajax / resource / 123 HTTP / 1.1 Cookie: Host: example.com`. Wenn er "Cookies anstelle von lokalem Speicher verwenden" meint, sollte er dies klarer sagen.
Dieser Artikel macht keinen Sinn.Wie unterscheidet der vorgeschlagene Proxyserver zwischen dem "echten Benutzer" und dem "Angreifer"?Alle http-Anfragen können gefälscht werden.CSRF benötigt nur einen zusätzlichen http-Aufruf, um ein CSRF-Token zu erhalten.Die einzige Lösung für das Problem des Autors kann Captcha und Ratenbegrenzung sein.Bitte erklären Sie, wenn ich falsch liege.
Mohammad Nikravan
2016-12-16 07:02:07 UTC
view on stackexchange narkive permalink

Sie müssen das Token in jedem Requset an den Server senden. Es spielt also keine Rolle, ob Sie es in einem Cookie- oder HTML 5-Speicher speichern. Beide sind sichere Speicher, und jeder, der Zugriff auf den Clientcomputer hat, hat ohnehin auch Zugriff auf das Token.

Ich empfehle jedoch, das übermittelte Token im Cookie auf Ihrem Server nicht zu verwenden, um CSRF-Angriffe zu verhindern. Ich denke, es ist eine gute Idee, das Token manuell in jede Anfrage aufzunehmen, die Sie bei Bedarf stellen.

Durch die Verwendung von Cookies wird auch der Anforderungsheader größer, was nicht angemessen ist.

Das ist widersprüchlich.Wie können Sie ein Token in jede Anfrage aufnehmen und gleichzeitig nicht in den HTTP-Header "Cookie:" aufnehmen?Nun, Sie könnten Ihren eigenen "X-Something:" - Header erstellen, aber das ist wahrscheinlich schlimmer, da Sie den Code für die Speicherung des Inhalts des Headers pflegen müssen.
Sie haben Recht.Für meine Web-Apps ist dies möglich, da ich immer nur einen API-Aufruf über eine Ajax-Anfrage aufrufe.Meine Methode kann also nicht in anderen Szenarien implementiert werden.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...