【问题标题】:oidc-client-js is not getting claims correctly from Identity Server 4oidc-client-js 未从 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 时,我看不到那些用户声明,只有“基本”客户端声明。

标签: javascript asp.net identityserver4 openid-connect oidc-client-js


【解决方案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/…
猜你喜欢
  • 2018-10-06
  • 2020-01-06
  • 2018-10-16
  • 1970-01-01
  • 2015-05-29
  • 2017-07-19
  • 2021-03-06
  • 2017-05-14
  • 2019-12-28
相关资源
最近更新 更多