6

我有一个 Identity Server 4 的本地实例,我正在尝试按照本指南创建一个 Javascript 客户端。这使用了oidc-client-js库,并且我使用了登录弹出方法,因此我的登录事件处理程序如下所示:

signin(e) {
    e.preventDefault();
    this.oidcUserMgr.signinPopup({state:'some data'}).then(function(user) {
        console.log("signed in", user.profile);
    }).catch(function(err) {
        console.log(err);
    });
} 

身份验证似乎工作正常 - 我被重定向到接受客户端请求、验证我的登录并将我返回到客户端应用程序的身份服务器。但是,文档说user.profile上面代码中的对象应该包含用户声明,但它没有。这是use.profile我回来的:

在此处输入图像描述

sub属性是刚刚通过身份验证的用户的正确 ID。但是我的身份服务器也发出声明以响应我的客户请求的其他范围(profileemail),所以我应该看到诸如name,preferred_username等声明emailIProfileService在 IS4 中调试我的实现时,我可以观察到这些声明被发出。此外,如果我使用access_token返回的用户对象向另一个在本地运行的 API(ASP.NET Web API)发出请求,我确实会在以下位置看到这些声明this.User.Claims

在此处输入图像描述

那么如何在我的 Javascript 代码中获取这些声明呢?

4

1 回答 1

6

这些用户声明很可能来自 ID 令牌。要完成这项工作,请检查您是否已进入AlwaysIncludeUserClaimsInIdToken = trueIDP 提供者的客户端配置,例如

        public static IEnumerable<Client> GetClients()
    {
        return new List<Client>()
        {
            new Client()
            {
                ClientName = "IDP Client",
                ClientId = "client",
                ClientSecrets = { new Secret("secret".Sha256()) },
                AllowedGrantTypes =  GrantTypes.Hybrid,
                RedirectUris = new List<string>()
                {
                    "http://localhost:60811/signin-oidc"
                },
                AllowedScopes =
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "myapi"
                },
                AlwaysIncludeUserClaimsInIdToken = true,
                AllowOfflineAccess = true
            },
于 2018-03-13T00:50:14.000 回答