Aktualisieren von Zugriffstoken in IdentityServer4-Clients

8

Ich frage mich, wie ich ein Zugriffstoken in einem IdentityServer4-Client unter Verwendung des hybriden Flusses aktualisieren kann und welches mit ASP.NET Core MVC erstellt wurde.

Wenn ich das ganze Konzept richtig verstanden habe, muss der Client zuerst den "offline_access" Geltungsbereich haben, um Refresh-Token verwenden zu können. Dies ist die beste Methode, um kurzlebige Zugriffstoken zu aktivieren und Refresh-Tokens zu sperren, die neue verhindern Zugriffstoken, die an den Client ausgegeben werden sollen.

Ich erhalte erfolgreich ein Zugriffstoken und ein Aktualisierungstoken, aber wie soll ich mit der eigentlichen Aktualisierungsprozedur des Zugriffstokens im MVC-Client umgehen?

Kann die OpenId Connect-Middleware (OIDC) dies automatisch handhaben? Oder sollte ich lieber die Ablaufzeit des Zugriffstokens überprüfen, wo immer ich WEB Api anrufe, indem ich grundsätzlich überprüfe, ob das Zugriffstoken abgelaufen ist oder sehr bald abläuft (bevorstehende 30 Sekunden), dann aktualisiere das Zugriffstoken durch Aufrufen des Tokenendpunktes mit dem Aktualisierungstoken ?

Wird empfohlen, die IdentityModel2 Bibliothek TokenClient Erweiterungsmethode RequestRefreshTokenAsync in meinen Controller-Aktionsmethoden zum Aufrufen des Tokens zu verwenden Endpunkt?

Ich habe Code gesehen, der in den OIDC-Middleware-Ereignissen Zugriffstoken anfordert und über den Antwortspeicher einen Anspruch verwendet, der eine Verfallsdatumszeit enthält. Das Problem ist, dass mein OIDC irgendwie automatisch ein Zugangstoken anfordert, so dass es nicht gut ist, ein neues Zugriffstoken direkt nach Erhalt des ersten zu beantragen.

Beispiel für eine Controller-Aktionsmethode ohne Zugriffstoken-Aktualisierungslogik:

%Vor%     
Jonas Axelsson 15.12.2016, 15:57
quelle

3 Antworten

8

Die OIDC Middleware wird nicht das für Sie übernehmen. Es wird ausgeführt, wenn es eine HTTP 401 -Antwort erkennt, und leitet den Benutzer dann zur IdentityServer-Anmeldeseite um. Nach der Weiterleitung zu Ihrer MVC-Anwendung werden die Ansprüche in ClaimsIdentity umgewandelt und an die Middleware von Cookies weitergeleitet, die diese in einem Sitzungscookie materialisiert.

Jede andere Anfrage bezieht die OIDC-Middleware nicht mit ein, solange der Cookie noch gültig ist.

Sie müssen sich also selbst darum kümmern. Eine weitere Sache, die Sie berücksichtigen sollten, ist, dass Sie das vorhandene Token aktualisieren müssen, wenn Sie das Zugriffstoken aktualisieren, damit Sie es nicht verlieren. Wenn Sie dies nicht tun, enthält das Sitzungscookie immer das gleiche Token - das Original - und Sie aktualisieren es jedes Mal.

Eine Lösung, die ich gefunden habe, ist, das in die Middleware von Cookies einzubinden. Hier ist der allgemeine Ablauf:

  • Verwenden Sie bei jeder Anfrage die Middleware-Ereignisse von Cookies, um das Zugriffstoken
  • zu überprüfen
  • Wenn es kurz vor der Ablaufzeit ist, fordern Sie eine neue an
  • Ersetze die neuen Zugriffs- und Aktualisierungstoken in ClaimsIdentity
  • Weisen Sie die Middleware von Cookies an, den Sitzungscookie zu erneuern, damit er die neuen Tokens enthält

Was mir an diesem Ansatz gefällt, ist, dass Sie in Ihrem MVC-Code ziemlich sicher sind, immer ein gültiges Zugriffs-Token zu haben, es sei denn, das Referencing des Tokens wird mehrmals hintereinander fehlgeschlagen.

Was ich nicht mag ist, dass es sehr an MVC gebunden ist - genauer gesagt an die Middleware von Cookies - also ist es nicht wirklich tragbar.

Ihr könnt dieses GitHub Repo zusammenstellen. Es verwendet tatsächlich IdentityModel , da dies alles erledigt und den größten Teil der Komplexität der HTTP-Aufrufe verdeckt, die Sie an IdentityServer vornehmen müssten.

    
Mickaël Derriey 09.01.2017, 21:52
quelle
1

Ich habe eine Lösung basierend auf einem Aktionsfilter zusammen mit der OIDC-Middleware in ASP.NET Core 2.0 erstellt.

AJAX-Anfragen gehen auch über den Aktionsfilter und aktualisieren daher das Zugriffstoken / Aktualisierungstoken.

Ссылка

    
Jonas Axelsson 26.10.2017 13:31
quelle
0

Ich habe zwei mögliche Lösungen gefunden, die beide gleich sind, aber zu unterschiedlichen Zeiten in der OIDC-Middleware auftreten. In den Ereignissen extrahiere ich den Wert der Ablaufzeit des Zugriffstokens und speichere ihn als einen Anspruch, der später verwendet werden kann, um zu überprüfen, ob eine Web-API mit dem aktuellen Zugriffstoken aufgerufen werden kann oder ob ich lieber ein neues Zugriffstoken mithilfe der Aktualisierung anfordern soll Token.

Ich würde mich freuen, wenn jemand etwas dazu sagen könnte, welches dieser Ereignisse vorzuziehen ist.

%Vor%

Und hier sind einige Beispiele, unter denen ich wählen kann:

%Vor%

Ich habe auch das UserInformationReceived-Ereignis, ich bin mir nicht sicher, ob ich dieses anstelle des TicketReceived-Ereignisses verwenden sollte.

%Vor%     
Jonas Axelsson 19.12.2016 12:43
quelle