Gewusst wie: hinzufügen Ansprüche zu access token erhalten von IdentityServer3 Verwendung des Ressourcen-Eigentümer fließen mit javascript-client
Ich benutze Besitzer der Ressource flow mit IdentityServer3 und senden Sie get-token anfordern, um die Identität server-token-Endpunkt mit dem Benutzernamen und Passwort in javascript wie folgt:
function getToken() {
var uid = document.getElementById("username").value;
var pwd = document.getElementById("password").value;
var xhr = new XMLHttpRequest();
xhr.onload = function (e) {
console.log(xhr.status);
console.log(xhr.response);
var response_data = JSON.parse(xhr.response);
if (xhr.status === 200 && response_data.access_token) {
getUserInfo(response_data.access_token);
getValue(response_data.access_token);
}
}
xhr.open("POST", tokenUrl);
var data = {
username: uid,
password: pwd,
grant_type: "password",
scope: "openid profile roles",
client_id: 'client_id'
};
var body = "";
for (var key in data) {
if (body.length) {
body += "&";
}
body += key + "=";
body += encodeURIComponent(data[key]);
}
xhr.setRequestHeader("Authorization", "Basic " + btoa(client_id + ":" + client_secret));
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(body);
}
Den access token zurückgegeben wird, von der Identität des Servers und der Benutzer authentifiziert ist. Dann habe ich dieses token verwenden, um Anfrage senden auf meine Web-Api.
Das problem ist, dass wenn ich überprüfen, ob der Benutzer wird eine Rolle zugewiesen, ich finde die Forderung gar nicht existiert.
[Authorize]
//GET api/values
public IEnumerable<string> Get()
{
var id = RequestContext.Principal as ClaimsPrincipal;
bool geek = id.HasClaim("role", "Geek"); //false here
bool asset_mgr = id.HasClaim("role", "asset_manager"); //false here
return new string[] { "value1", "value2" };
}
Hier ist, wie der client definiert ist, in der identity server.
new Client
{
ClientName = "Client",
ClientId = "client_id",
Flow = Flows.ResourceOwner,
RequireConsent = false,
AllowRememberConsent = false,
AllowedScopes = new List<string>
{
"openid",
"profile",
"roles",
"sampleApi"
},
AbsoluteRefreshTokenLifetime = 86400,
SlidingRefreshTokenLifetime = 43200,
RefreshTokenUsage = TokenUsage.OneTimeOnly,
RefreshTokenExpiration = TokenExpiration.Sliding,
ClientSecrets = new List<Secret>
{
new Secret("4C701024-0770-4794-B93D-52B5EB6487A0".Sha256())
},
},
und dies ist, wie der Benutzer definiert ist:
new InMemoryUser
{
Username = "bob",
Password = "secret",
Subject = "1",
Claims = new[]
{
new Claim(Constants.ClaimTypes.GivenName, "Bob"),
new Claim(Constants.ClaimTypes.FamilyName, "Smith"),
new Claim(Constants.ClaimTypes.Role, "Geek"),
new Claim(Constants.ClaimTypes.Role, "Foo")
}
}
Wie kann ich Forderungen an den access_token in diesem Fall? Vielen Dank!
- Die richtige Antwort ist hier: stackoverflow.com/questions/34107146/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich nur damit verbracht herauszufinden, während dies selbst. @leastprivilege Kommentar Yang die Antwort hatte die Ahnung, diese Antwort ist nur die Erweiterung auf Sie.
Es ist alles bis auf, wie die oAuth-und OIDC-Spezifikationen entwickelt, ist es nicht ein Artefakt der IdentityServer (die genial ist).
Erstens, hier ist eine ziemlich anständige Diskussion über die Unterschiede zwischen Identitäts-Token und access Token: https://github.com/IdentityServer/IdentityServer3/issues/2015 die es Wert ist, gelesen zu werden.
Mit Ressourcen-Eigentümer fließen, wie Sie tun, erhalten Sie immer einen Access-Token. Standardmäßig und gemäß der Spezifikation, Sie sollten keine Ansprüche in token (sehen Sie den obigen link, warum). Aber in der Praxis ist es sehr schön, wenn Sie es können; es spart Ihnen zusätzlichen Aufwand auf client und server.
Was Leastprivilege bezieht sich auf ist, dass Sie brauchen, um einen Bereich erstellen, so etwas wie dieses:
Und dann müssen Sie die Anforderung, Anwendungsbereich, wenn Sie Fragen, für die token. I. e. Ihre Linie
scope: "openid profile roles",
ändern solltescope: "member",
(nun, ich sagen, dass - Bereiche spielen eine doppelte Rolle hier, soweit ich sehen kann - Sie sind auch eine form der Kontrolle, d.h. der Patient ist zu Fragen, für bestimmte Bereiche und können zurückgewiesen werden, wenn es nicht erlaubt ist, diese aber das ist ein anderes Thema).Beachten Sie die wichtige Zeile, die fehlte mir für eine Weile, die
Type = ScopeType.Resource
(weil die Access-Tokens sind über die Steuerung des Zugriffs auf Ressourcen). Das bedeutet, es gelten für Access Token und die angegebenen Forderungen werden in der token (glaub ich, vielleicht, gegen die spec aber wunderbar).Schließlich in meinem Beispiel habe ich sowohl einige spezifische Forderungen sowie
IncludeAllClaimsForUser
das ist natürlich albern, aber wollte nur zeigen Ihnen einige Optionen.Ich finde, ich kann dies erreichen, indem Sie ersetzen die Standard-IClaimsProvider von IdentityServerServiceFactory.
Den cusomized IClaimsProvider ist wie folgt:
Dann ersetzen Sie die IClaimsProvider wie diese:
Das Ergebnis ist, dass, wenn die Anfrage für den Zugriffstoken wird gesendet, um token-Endpunkt der Ansprüche Hinzugefügt werden, um das access_token.
Nicht nur, dass ich habe versucht, andere Methoden, ich habe versucht, alle möglichen Kombinationen von Bereichen etc. Alles was ich Lesen konnte in der access-token "scope" "scope-name", für den Ressourcen-Fluss gab es keine Forderungen, ich habe Zeit.
Ich hatte zu tun, alle diese
Ich denke, dieser Letzte Schritt getan werden könnte, überschreiben GetProfileDataAsync in der benutzerdefinierten UserServiceBase, aber die oben gerade gearbeitet, also wollte ich nicht stören.
Das Allgemeine problem ist nicht, wie man die gesetzt Ansprüche, es ist, wo Sie füllen Sie. Sie überschreiben müssen, irgendwo etwas.
Diese hier für mich gearbeitet, da brauchte ich die Daten aus einer Datenbank, sollen andere füllen Ansprüche anderswo. Aber Sie sind nicht magisch erscheinen, nur weil Sie schön gesetzt, Bereiche und Ansprüche Identity Server-Konfigurationen.
Meisten Antworten sagen nicht ein Wort über wo um die Forderung Werte richtig. In den jeweiligen überschreiben, die Sie getan haben, die übergebenen Parameter, wenn Sie behauptet, in der Funktion angebracht sind, um die Identität oder access token.
Nur kümmern, und alles wird in Ordnung sein.