7

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

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

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

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

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

scope: 'openid profile email api1',

知道我需要改变什么来获得这个“given_name”声明吗?

4

4 回答 4

1

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

于 2018-08-08T12:14:47.200 回答
1

OauthService.getIdentityClaims()是一个 Promise 并认为UserInfo您可以使用大括号提取名称字段,因此您的函数应该是:

public get name() {
    let claims = this.oauthService.getIdentityClaims();
    if (!claims) return null;
    return claims['name'];
}
于 2020-11-06T12:52:59.940 回答
0

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

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

例子:

getUserClaims() {
    const user = this.oauthService.loadUserProfile();
    console.log(user, user);
}
于 2020-07-23T01:53:38.640 回答
0

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

于 2022-02-08T08:03:41.037 回答