So fügen Sie Ansprüche zum Zugriffstoken hinzu, die von IdentityServer3 mithilfe des Ressourcenbesitzerflusses mit JavaScript-Client abgerufen werden

8

Ich benutze den Ressourcenbesitzerfluss mit IdentityServer3 und sende get-Token-Anfrage an den Identitätsserver-Token-Endpunkt mit Benutzername und Passwort in Javascript wie folgt:

%Vor%

Das Zugriffstoken wird vom Identitätsserver zurückgegeben und der Benutzer wird authentifiziert. Dann verwende ich dieses Token, um eine Anfrage an meine Web-API zu senden.

Das Problem ist, dass wenn ich überprüfe, ob der Benutzer eine Rolle zugewiesen ist, finde ich den Anspruch nicht existiert.

%Vor%

Hier ist, wie der Client im Identity Server definiert ist.

%Vor%

und so ist der Benutzer definiert:

%Vor%

Wie kann ich in diesem Fall Ansprüche an das access_token hinzufügen? Vielen Dank!

    
Yang Zhang 26.11.2015, 22:35
quelle

3 Antworten

15

Ich habe gerade eine Weile damit verbracht, das herauszufinden. @ lestprivileges Kommentar zu Yangs Antwort hatte den Hinweis, dass diese Antwort nur darauf ausgedehnt wird.
Es hängt alles davon ab, wie sich die oAuth- und OIDC-Spezifikationen entwickelt haben, es ist kein Artefakt von IdentityServer (was großartig ist). Erstens, hier ist eine ziemlich anständige Diskussion über die Unterschiede zwischen Identitäts-Tokens und Access-Tokens: Ссылка , die es wert sind gelesen zu werden .

Mit dem Fluss des Ressourceneigentümers, wie Sie es tun, erhalten Sie immer einen Access Token. Standardmäßig und gemäß der Spezifikation sollten Sie keine Ansprüche in dieses Token aufnehmen (siehe den obigen Link für den Grund). Aber in der Praxis ist es sehr schön, wenn Sie können; Es erspart Ihnen zusätzlichen Aufwand auf Client und Server.

Was Leastprivilege betrifft, ist, dass Sie einen Bereich erstellen müssen, etwa so:

%Vor%

Und dann müssen Sie diesen Bereich anfordern, wenn Sie nach dem Token fragen. I.e. deine Linie scope: "openid profile roles", sollte in scope: "member", geändert werden (nun, ich sage das - Bereiche spielen hier eine Doppelrolle, soweit ich sehen kann - sie sind auch eine Form der Kontrolle, dh der Client fragt nach bestimmten Bereichen und kann abgelehnt werden wenn es nicht erlaubt ist, aber das ist ein anderes Thema).

Beachten Sie die wichtige Zeile, die mir eine Weile entgangen ist, nämlich Type = ScopeType.Resource (weil Zugriffstoken den Zugriff auf Ressourcen steuern). Dies bedeutet, dass es auf Zugriffstoken angewendet wird und die angegebenen Ansprüche in das Token aufgenommen werden (ich denke, möglicherweise gegen spec, aber wunderbar).

Schließlich habe ich in meinem Beispiel sowohl bestimmte Ansprüche als auch IncludeAllClaimsForUser aufgenommen, was offensichtlich albern ist, aber ich wollte Ihnen nur einige Optionen zeigen.

    
Frans 21.02.2016 17:06
quelle
1

Ich finde, dass ich dies erreichen kann, indem ich den Standard IClaimsProvider von IdentityServerServiceFactory ersetze.

Der cusomized IClaimsProvider ist wie folgt:

%Vor%

Ersetzen Sie dann den IClaimsProvider wie folgt:

%Vor%

Wenn die Anforderung für das Zugriffstoken an den Token-Endpunkt gesendet wird, werden die Ansprüche dem access_token hinzugefügt.

    
Yang Zhang 27.11.2015 04:49
quelle
0

Nicht nur, dass ich andere Methoden ausprobierte, sondern auch alle möglichen Kombinationen von Bereichen. Alles, was ich im Zugriffstoken lesen konnte, war "scope", "scope name", für Resource Flow gab es keine Ansprüche, die ich hinzugefügt habe.

Ich musste das alles machen

  1. Fügen Sie benutzerdefinierte UserServiceBase hinzu und überschreiben Sie AuthenticateLocalAsync, da ich dort Benutzername / Passwort habe und beide von der Datenbank
  2. abholen müssen
  3. Fügen Sie Behauptungen hinzu, die ich in der gleichen Funktion benötige (das selbst wird keinen Anspruch auf Access Token hinzufügen, aber Sie können sie in verschiedenen ClaimsPrincipal-Parametern herum lesen)
  4. Fügen Sie einen benutzerdefinierten DefaultClaimsProvider hinzu und überschreiben Sie GetAccessTokenClaimsAsync, wenn ClaimsPrincipal die zuvor angegebenen Ansprüche enthält, ich nehme sie einfach heraus und lege sie erneut in die Liste der Ansprüche für das Ergebnis.

Ich denke, dieser letzte Schritt könnte GetProfileDataAsync in der benutzerdefinierten UserServiceBase überschreiben, aber das obige funktionierte einfach so, dass ich es nicht stören wollte.

Das generelle Problem besteht nicht darin, Ansprüche festzulegen, sondern an dieser Stelle. Sie müssen irgendwo etwas überschreiben.

Dies hier funktioniert für mich, da ich Daten aus einer Datenbank brauchte, jemand anders sollte Ansprüche an anderer Stelle ausfüllen. Aber sie werden nicht magisch erscheinen, nur weil Sie Scope- und Claims-Identity-Server-Konfigurationen schön festgelegt haben.

Die meisten Antworten sagen kein Wort über wo , um die Anspruchswerte richtig festzulegen. Bei jeder Überschreibung, die Sie durchgeführt haben, werden die übergebenen Parameter in der Funktion, wenn sie Ansprüche haben, an das Identity - oder -Zugriffstoken angehängt.

Passen Sie einfach auf und alles wird gut.

    
alex.peter 18.08.2016 14:26
quelle