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!

InformationsquelleAutor Yang Zhang | 2015-11-26
Schreibe einen Kommentar