Soll ich meine Benutzeransprüche im JWT-Token speichern?

18

Ich verwende JWT-Token in HTTP-Headern, um Anforderungen an einen Ressourcenserver zu authentifizieren. Der Ressourcenserver und der Authentifizierungsserver sind zwei separate Arbeiterrollen in Azure.

Ich kann mich nicht entscheiden, ob ich die Ansprüche im Token speichern oder auf andere Weise an die Anfrage / Antwort anhängen soll. Die Anspruchsliste wirkt sich auf das Rendern clientseitiger Benutzeroberflächenelemente sowie auf den Zugriff auf Daten auf dem Server aus. Aus diesem Grund möchte ich sicherstellen, dass die vom Server eingegangenen Ansprüche authentisch und validiert sind, bevor die Anfrage bearbeitet wird.

Beispiele für Ansprüche sind: CanEditProductList, CanEditShopDescription, CanReadUserDetails.

Die Gründe, warum ich das JWT-Token für sie verwenden möchte, sind:

  • Besserer Schutz vor clientseitiger Bearbeitung von Ansprüchen (z. B. Hacking Claims List).
  • Es ist nicht erforderlich, die Ansprüche bei jeder Anfrage nachzuschlagen.

Die Gründe, warum ich das JWT-Token nicht verwenden möchte:

  • Der Authentifizierungsserver muss dann die app-zentrierte Anspruchsliste kennen.
  • Das Token wird zu einem einzigen Punkt des Hack-Eintrags.
  • Ich habe einige Dinge gelesen, die besagen, dass JWT-Token nicht für Daten auf App-Ebene gedacht sind.

Es scheint mir, dass beide Nachteile haben, aber ich neige dazu, diese Behauptungen in das Token aufzunehmen und möchte dies nur von Leuten ausführen lassen, die sich zuvor damit befasst haben.

ANMERKUNG: Ich verwende HTTPS für alle API-Anforderungen, daher scheint mir das Token "sicher genug" zu sein. Ich benutze AngularJS, C #, Web API 2 und MVC5.

Astravagrant
quelle
lese das jetzt .... und hätte gerne ein update wenn du kannst. Es würde mich interessieren, was Sie getan haben, da ich vor dem gleichen .. Denken stehe und mir fehlt, wie einige der Teile funktionieren sollen. Der Benutzer erhält ein Autorisierungs-Token, aber wie sollen die Ansprüche dann ausgeführt werden? Können Sie Ihre Ergebnisse erläutern? Das würde mir wahrscheinlich helfen.
Seabizkit

Antworten:

7

Ich speichere nur Identifizierungsansprüche (Benutzer-ID usw.) (verschlüsselt) in meinem JWT.

Wenn ich dann das Token auf dem Server (API) erhalte, kann ich eine serverseitige Suche durchführen (DB oder API-Aufruf des lokalen Netzwerks) und alle Zuordnungen zur Benutzer-ID (Apps, Rollen usw.) abrufen.

Wenn Sie jedoch mehr in das JWT schreiben möchten, achten Sie einfach auf die Größe, da diese wahrscheinlich bei jeder Anforderung gesendet wird. Achten Sie jedoch darauf, vertrauliche Forderungsdaten zu verschlüsseln.

wchoward
quelle
Prost, DL. Zwischenspeichern Sie die Rollen usw. auf dem API-Server oder schlagen Sie die Datenbank jedes Mal zweimal, wenn Sie eine Anfrage erhalten? (dh einmal für die Rollen und einmal für die tatsächlich angeforderten Daten). Wenn Sie es zwischenspeichern, würde mich interessieren, welche Methode Sie verwenden. Meinen Sie damit auch, dass Sie die Benutzer-ID 'innerhalb' des bereits verschlüsselten Tokens weiter verschlüsseln? Vielen Dank.
Astravagrant
1
Ich bin noch nicht so weit in meine Implementierung gekommen :), aber ja, ich habe überlegt, einen Caching-Server zu verwenden, damit ich die Datenbank nicht so oft betrete und wenn sich eine Rolle ändert, kann der Cache entfernt werden, um die neue zuzulassen Rolle abgefragt, um gespeicherter Cache geladen zu werden. In meinem Fall würde ich wahrscheinlich Amazon AWS elsticache verwenden, das auf dem Open Memcached basiert, aber einfacher zu konfigurieren und zu verwenden ist.
wchoward
Ich halte es auch für eine bessere Idee, alle erforderlichen Informationen auf dem Ressourcenserver abzurufen und nicht in einem Token zu speichern.
Mateusz Migała
also für jede anfrage bekommst du die benutzerrollen ... behauptet ... könntest du mich auf einen artikel verweisen oder etwas was dies als machbar zeigt. Momentan benutze ich eine Sitzung, suche aber nach einer besseren Möglichkeit, Dinge zu erledigen, aber bei jeder Anfrage nachzuschlagen, fühlt sich nicht richtig an?
Seabizkit
3

Es hört sich so an, als ob die Authentifizierung (wer der Benutzer ist) und die Autorisierung (was der Benutzer tun darf) nicht so klar voneinander getrennt sind, wie Sie es möchten.

Wenn Sie nicht möchten, dass der Authentifizierungsserver weiß, zu was der Benutzer berechtigt ist, begrenzen Sie die Ansprüche in diesem JWT auf die Benutzer-ID, wie von wchoward vorgeschlagen. Ein anderer Server, der als Autorisierungsserver bezeichnet wird, kann nachschlagen, worauf der Benutzer Anspruch hat.

Der Autorisierungsschritt kann vom Ressourcenserver ausgeführt werden, wenn ihm vom Client zum ersten Mal ein Authentifizierungstoken vorgelegt wird. Der Ressourcenserver sendet dann ein Token mit Berechtigungsansprüchen an den Client.

Hinweis: Beide JWTs sollten mit unterschiedlichen Schlüsseln signiert sein.

Vorteile:

  • Authentifizierung und Autorisierung werden separat verwaltet.
  • Der Ressourcenserver muss nicht bei jeder Anforderung nach Berechtigungen suchen.
  • Die Benutzeroberfläche hat Zugriff auf die Berechtigung, kann diese jedoch nicht bearbeiten.

Con:

  • Der Client muss zwei Token anstelle von einem verarbeiten.
  • Durch Hinzufügen eines Berechtigungsservers wird ein weiteres zu verwaltendes Teil hinzugefügt.
Chad Clark
quelle
1
Vergessen Sie nicht, dass Sie auch dann, wenn Sie die Autorisierung in der Benutzeroberfläche überprüfen, die Autorisierung auf der Serverseite überprüfen müssen, wenn eine Anforderung eingeht.
Chad Clark