使用 angular-oauth2-oidc 和 Identity Server 4 时无法获取用户名/given_name

Cannot get Username / given_name when using angular-oauth2-oidc and Identity Server 4

我正在关注 angular-oauth2-oidc 文档中的隐式工作流示例。

我的 Angular 应用程序一切正常,我可以登录(在此期间我被重定向到 Identity Server),获取我的令牌并使用此令牌访问我的 Web Api。

但是,我注意到 "given_name" 声明为空,因此用户名未显示在登录页面上。具体来说,示例代码中的以下方法似乎 return null:

public get name() {
    let claims = this.oauthService.getIdentityClaims();
    if (!claims) return null;
    return claims.given_name;
}

我认为这可能是权限问题,但我的范围设置为:

scope: 'openid profile email api1',

知道我需要更改什么才能获得此 "given_name" 声明吗?

对于遇到同样问题的人。您可以通过在身份提供者端的 client settings 中添加此行 AlwaysIncludeuserClaimsInIdToken=true 来修复它。

标记为“最佳答案”的答案不正确。在 'idtoken' 中获取用户声明会导致 'idtoken' 非常大,然后您可能会超过大小限制。

正确的实现是使用 'UserInfo' 端点,然后使用方法 'loadUserProfile':

示例:

getUserClaims() {
    const user = this.oauthService.loadUserProfile();
    console.log(user, user);
}

OauthService.getIdentityClaims() 是一个 Promise 并持有 UserInfo 你可以用大括号提取名称字段,所以你的函数应该是:

public get name() {
    let claims = this.oauthService.getIdentityClaims();
    if (!claims) return null;
    return claims['name'];
}

我有同样的问题,在我的情况下,浏览器控制台上显示错误,说请求被安全策略阻止。 即使在启动时调用了 AllowAnyOrigin() 方法,我也无法获得 header 允许。因此,当在我的 angular aap 中时,我通过 token_received 事件,它发送了一些不允许的 header。 最后这解决了我的问题: app.UseCors(选项 => options.AllowAnyOrigin().AllowAnyHeader()); 不要忘记在使用 mvc

之前调用它