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!
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.
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.
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
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.
Tags und Links asp.net-web-api oauth-2.0 identityserver3 openid identityserver2