oidc-client-js 未从 Identity Server 4 正确获取声明

Posted

技术标签:

【中文标题】oidc-client-js 未从 Identity Server 4 正确获取声明【英文标题】:oidc-client-js is not getting claims correctly from Identity Server 4 【发布时间】:2018-08-20 05:37:52 【问题描述】:

我有一个 Identity Server 4 的本地实例,我正在尝试关注 this guide 来创建一个 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。但是我的 Identity Server 也针对我的客户请求的其他范围(profileemail)发布了声明,因此我应该看到诸如 namepreferred_usernameemail 等声明。在 IS4 中调试我的IProfileService 实现时,我可以观察到这些声明。此外,如果我使用与用户对象一起返回的 access_token 向本地运行的另一个 API(ASP.NET Web API)发出请求,我确实在 this.User.Claims 中看到了这些声明:

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

【问题讨论】:

您能否使用应该是标准 openId Connect 实现的 userinfo 端点。该 api 应该返回您所需的所有响应? @Sohan 我的假设是 openid-connect-js 库已经这样做了,因为 IS4 文档建议它应该使用请求的声明填充 user.profile。 您是否在 JSapp 和数据库 [ClientScopes] 中设置了范围?您的应用需要请求它们,以便它们响应。 @getsetcode 很抱歉在这里问,但是,您如何在外部 API 项目中获得这些用户声明(姓名、电子邮件等)?当我在 ApiController 中访问 this.User.Claims 时,我看不到那些用户声明,只有“基本”客户端声明。 【参考方案1】:

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

        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
            ,

【讨论】:

你说得对。我以前没有被告知该属性。谢谢你。来自文档:“AlwaysIncludeUserClaimsInIdToken - 在同时请求 id 令牌和访问令牌时,是否应始终将用户声明添加到 id 令牌中,而不是要求客户端使用 userinfo 端点。默认值为 false。” (参考docs.identityserver.io/en/release/reference/…)

以上是关于oidc-client-js 未从 Identity Server 4 正确获取声明的主要内容,如果未能解决你的问题,请参考以下文章

oidc-client-js 回调后无响应状态

带有 IdentityServer4 和 oidc-client-js 的 ReactJS 错误:“没有响应代码”

oidc-client-js 针对 Auth0 的 signoutRedirect 不返回结束会话端点

OidcClient.readSigninResponseState:在存储中找不到匹配的状态 - oidc-client-js (Angular)

在 Angular 中使用 IdentityServer4 + oidc-client-js 在空闲时注销用户

text IdentitéreliéeàOpenKeychain