Implementierung eines einzelnen Authentifizierungspunkts

8

Ich erstelle eine Reihe von Web-Apps, die mit einem einzigen Authentifizierungspunkt verbunden sind. Grundsätzlich versucht ein Benutzer, auf eine Site zuzugreifen. Wenn er nicht authentifiziert ist, wird er auf die Anmeldeseite des zentralen Authentifizierungssystems umgeleitet. Sobald sie sich erfolgreich angemeldet haben, werden sie zu ihrer App weitergeleitet. Wenn sie von da an auf eine andere App zugreifen, werden sie automatisch angemeldet.

Ein paar zusätzliche Details: 1) Die Apps werden alle unter derselben Domain ausgeführt, sodass ich Domain-Cookies verwenden kann, was die Sache einfacher macht. 2) Benutzern kann Zugriff auf einige Apps und nicht auf andere gewährt werden, sodass dies berücksichtigt werden muss. 3) Der Benutzer muss in der Lage sein, für jede App spezifische Berechtigungen abzurufen.

Ich habe etwas implementiert, bin aber nicht 100% zufrieden damit. Im Moment habe ich Folgendes: 1) Die Web-App prüft, ob eine Sitzung (spezifisch für die App) und ein Cookie vorhanden sind, bei dem es sich um ein JWT-Token handelt, das vom zentralisierten Authentifizierungssystem gesendet wurde. 2) Wenn kein Cookie vorhanden ist, leite ich zur Anmeldeseite des Authentifizierungssystems weiter. 3) Sobald sich der Benutzer anmeldet, wird er zu seiner App umgeleitet, die ein JWT-Token übergibt. 4) Die App überprüft das Token über einen REST-API-Aufruf an das Authentifizierungssystem (für diese REST-API-Aufrufe ist ein separates Zugriffstoken erforderlich). Wenn es gültig ist, wird das JWT-Token als Cookie gespeichert und eine Sitzung mit dem initiiert Benutzer angemeldet; 5) Wenn die App-Sitzung abläuft, prüft sie, ob das Cookie vorhanden ist. Wenn dies der Fall ist, führt die App dasselbe wie in Schritt 4 aus, überprüft das Token und startet die Sitzung erneut. 6) Beim Abmelden löscht das System nur das Cookie. Sicherstellen, dass der Benutzer von allen Apps abgemeldet ist; 7) Wenn das Token abläuft, verwendet die App das abgelaufene Token, um ein neues Token anzufordern, bei dem die Tokensignatur und andere Ansprüche vor der Ausstellung eines neuen validiert werden. Das einzige, was nicht validiert wird, ist der Ablaufanspruch.

Zur Verdeutlichung wird das Vorhandensein einer für die App spezifischen Sitzung verwendet, damit Sie nicht ständig REST-API-Aufrufe durchführen müssen, um das Token zu überprüfen. Wäre es angesichts der einmaligen Überprüfung des Tokens sicher, dieses Cookie nur als Indikator für eine gültige Sitzung zu verwenden?

Eine Sache, bei der ich mir nicht sicher bin, ist, dass mein Token etwas haben muss, das angibt, für welche App es ist, da andere REST-API-Aufrufe mithilfe des Tokens durchgeführt werden können, um einige Ressourcen abzurufen, die app-spezifisch sind. Wenn ich jedoch ein Token für App1 erhalte und mich dann bei App2 anmelde, verlässt sich App2 auf das von App2 generierte Cookie. Es scheint also, als würde ich zwei Token haben wollen, eines, das als Domain-Cookie gespeichert werden kann, um anzuzeigen, dass der Benutzer authentifiziert ist, und ein anderes, das tatsächlich app-spezifisch ist und zum Ausführen von REST-API-Aufrufen für andere Apps verwendet werden kann. spezifische Ressourcen.

Kompliziere ich das zu sehr oder stimmt meine Denkweise mit dem überein, was andere da draußen sehen / tun? Oder gibt es eine elegantere Möglichkeit, dies zu tun? Ich habe darüber nachgedacht, so etwas wie Open ID zu implementieren, aber es scheint ein bisschen übertrieben für unsere Bedürfnisse zu sein. Ich möchte, dass dies so einfach wie möglich ist, damit ich den Prozess dokumentieren kann und andere Entwicklerteams Apps entwickeln können, die sich in das Authentifizierungssystem einbinden lassen, ohne zu viel Unterstützung zu benötigen.

Rocket04
quelle

Antworten:

5

Sei nicht verrückt. Niemand, der bei klarem Verstand ist, würde versuchen, so etwas von Grund auf neu zu schreiben. Verwenden Sie OAuth. Sie können die JWT Bearer-Token-Spezifikation für das Token verwenden und mithilfe von Bereichen bestimmen, auf welche App oder Ressource der Benutzer Zugriff hat. Dies ist kein guter Bereich, um das Rad neu zu erfinden!

RibaldEddie
quelle
0

Ich habe vor kurzem folgte nur eine Anleitung hier , die den Setup - Prozess für Token basierende Authentifizierung erklärt. Eine Möglichkeit, die ich mir vorstellen kann, eine App-spezifische Identifikation zu übergeben, wäre die Verwendung von Ansprüchen.

Sie haben also Website A, die Sie zu Ihrer Anmeldesystemseite weiterleitet. Website A hat auch einige andere Daten übergeben, z. B. wohin der Benutzer nach der Anmeldung gebracht werden soll und wo sich Website A befindet. Ihr Authentifizierungssystem überprüft diese Daten und hängt mithilfe eines Schalters in irgendeiner Form einen Anspruch an das Benutzertoken an, das den aktuellen Anwendungsbereich identifiziert.

Um zu verhindern, dass der Benutzer Apps sehr schnell wechselt und weiterhin Zugriff auf App-Ressourcen für App1 hat, während er sich in App2 befindet, verfallen Ihre access_tokens sehr schnell. In meiner laufenden Demo-Website, die mit der obigen Anleitung erstellt wurde, läuft meine jede Minute ab, und die Implementierung eines refresh_token erleichtert alles. Ein weiterer Schritt, der hilfreich sein könnte, besteht darin, beim Anhängen von Ansprüchen an Benutzer auch eine Rolle an diesen Benutzer anzuhängen, die angibt, dass er sich auf einer Website befindet.

Stellen Sie dann in app1s / api / endpoint / getData [Authorize (Roles = "App1")] ein, um sicherzustellen, dass nur access_tokens, die eine Rolle = App1 enthalten, diesen Endpunkt dann in Ihrem Javascript oder einem beliebigen clientseitigen Skript verwenden können, das Sie einfach verwenden Führen Sie logische Überprüfungen auf Fehler durch, z. B. wenn Sie nicht auf einen bestimmten Endpunkt zugreifen. Möglicherweise muss der Benutzer mithilfe des Aktualisierungstokens usw. ein neues access_token abrufen.

Folgen Sie mit demselben Leitfaden, den ich oben aufgeführt habe, diesem Link und suchen Sie danach:

var identity = new ClaimsIdentity (context.Options.AuthenticationType);

Wie Sie sehen können, fügt die Identität Ansprüche hinzu, bei denen es sich im Grunde nur um Werte handelt, die im access_token eingekapselt werden.

Wenn ein Benutzer Ihre Web-API aufruft, über der sich ein autorisiertes Attribut befindet, überprüfen Sie einfach die Ansprüche des Benutzers.

Ein Beispiel hierfür finden Sie hier .

Bailey Miller
quelle