Comment ajouter des revendications pour obtenir un jeton d'accès de IdentityServer3 à l'aide de ressources propriétaire de flux avec javascript client

J'utilise le propriétaire de la ressource de flux avec IdentityServer3 et envoyer obtenir de demande de jeton à l'identité du serveur jeton d'extrémité avec le nom d'utilisateur et le mot de passe dans le code javascript ci-dessous:

        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);
    }

Le jeton d'accès est retourné à partir du serveur de l'identité et de l'authentification de l'utilisateur. Puis-je utiliser ce jeton d'envoyer une requête à mon Api Web.

Le problème est que lorsque je vérifie si l'utilisateur est affecté à un rôle, je trouve que la demande n'existe pas.

    [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" };
    }

Ici est de savoir comment le client est défini dans le serveur d'identité.

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())
                },
            },

et c'est de cette façon l'utilisateur est défini:

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")
                }
            }

Comment puis-je ajouter des réclamations à l'access_token dans ce cas? Merci beaucoup!

La bonne réponse est ici: stackoverflow.com/questions/34107146/...

OriginalL'auteur Yang Zhang | 2015-11-26