MSAL Angular:如何从 JWT 令牌中检索用户角色?

Posted

技术标签:

【中文标题】MSAL Angular:如何从 JWT 令牌中检索用户角色?【英文标题】:MSAL Angular: How can I retrieve the user role from the JWT token? 【发布时间】:2020-09-12 04:48:39 【问题描述】:

我知道有类似的问题,但没有一个能解决我的问题。我有一个针对 Azure AD 的带有 JWT 不记名令牌身份验证的 ASP.net Core API。现在,我还有一个使用 MSAL 库的 Angular SPA,它从这个 API 中检索数据。对于授权,我使用在 Azure AD 中向应用程序注册的用户组。这部分就像一个魅力。

在这个用户组中,我有不同的用户角色,它们也在标头的 Bearer token 字段中正确传输,因此 API 的某些部分只能由该组中具有管理员角色的用户访问。这也很有效。

现在在 Angular 方面,我想显示一些对用户不可见的管理员用户的链接。这些是从 API 部分检索数据的链接,仅适用于管理员用户。要隐藏/显示这些链接,我需要知道用户是否在管理员组中。从标头解码 Bearer 令牌时,它会显示我在解码令牌中的应用清单中配置的用户组和角色:

[...],
 "given_name": "JohnDoe",
  "groups": [
    "abcdef12-3456-7890-abcd-ef0123456789"
  ],
[...],
  "roles": [
    "MyAdminRole"
  ],
[...]

现在,当我尝试从我的 Angular 应用程序访问令牌时,我会得到用户所在的所有组的列表,并且绝对没有任何角色。在我的组件中,我使用这一行来访问令牌:

import  JwtHelperService  from '@auth0/angular-jwt';
import  MsalService  from '@azure/msal-angular';

constructor(private jwtHelper: JwtHelperService, private authService: MsalService, http: HttpClient, @Inject('BASE_URL') baseUrl: string)
  
    let token: string = localStorage.getItem("msal.idtoken");
    console.log(this.jwtHelper.decodeToken(token));
  

现在这是控制台上记录的内容(已删除 id):

aud: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", iss: "https://login.microsoftonline.com/8xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0", iat: 1590411759, nbf: 1590411759, exp: 1590415659, …
aio: "xxxxxxxxxxxxxxxxxxxN"
aud: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
exp: 1590415659
groups: Array(5)
0: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
1: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
2: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
3: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
4: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
length: 5
__proto__: Array(0)
iat: 1590411759
iss: "https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0"
name: "John Doe"
nbf: 1590411759
nonce: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
oid: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
preferred_username: "john@doe.com"
sub: "xxxxxxxxxxxxx"
tid: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
uti: "xxxxxxxxxxxxx"
ver: "2.0"

所以这是我的问题:如何将请求标头的不记名令牌中明显存在的组名放入 Angular? 其他有趣的令牌从何而来,不是以这种方式创建的在应用清单中列出?

请注意:我没有在前端使用用户组来授予或阻止访问,这是在服务器端完成的,并且运行良好。它只是在视觉上对普通用户隐藏一些管理员链接,以免混淆他们。如果普通用户可以访问这些功能,它们将无法工作,因为 API 会以 401 响应。

【问题讨论】:

您有两个应用程序注册 API 和 UI 还是一个注册? 好吧,我错误地认为它是一个,实际上它是两个。这解决了这个问题,感谢您指出我正确的方向! 【参考方案1】:

我错误地认为前端和 API 都只有一个应用注册,实际上是两个。未在前端应用程序的 Azure 应用清单中正确配置令牌。感谢 juunas 指出这一点!

【讨论】:

以上是关于MSAL Angular:如何从 JWT 令牌中检索用户角色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 中从服务器获取带有 jwt 令牌的响应标头

如何从 django rest 框架访问 jwt 令牌到 Angular 前端

在 Angular 中使用 MSAL 和在 WebAPI 中使用 JWT Auth 时 API 请求触发 CORS 错误

如何将 JWT 令牌从 PHP 发送到 Angular?

如何使用MSAL.js为Azure DevOps获取有效的AAD v2令牌

如何从角度 6 中的“响应标头”获取 JWT 令牌