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 也针对我的客户请求的其他范围(profile
和 email
)发布了声明,因此我应该看到诸如 name
、preferred_username
、email
等声明。在 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 正确获取声明的主要内容,如果未能解决你的问题,请参考以下文章
带有 IdentityServer4 和 oidc-client-js 的 ReactJS 错误:“没有响应代码”
oidc-client-js 针对 Auth0 的 signoutRedirect 不返回结束会话端点
OidcClient.readSigninResponseState:在存储中找不到匹配的状态 - oidc-client-js (Angular)