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



我意识到有类似的问题,但没有一个能解决我的问题。我有一个 ASP.net 核心 API,其中包含针对 Azure AD 的 JWT 持有者令牌身份验证。现在,我还有一个使用 MSAL 库的 Angular SPA,用于从此 API 检索数据。对于授权,我使用在 Azure AD 中注册到应用的用户组。这部分就像一个魅力。

在这个用户组中,我有不同的用户角色,这些角色也在标头的持有者令牌字段中正确传输,因此 API 的某些部分只能由该组中具有管理员角色的用户访问。这也非常有效。

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

[...],
"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 只有一个应用程序注册,实际上是两个。令牌未在前端应用程序的 Azure 应用清单中正确配置。感谢朱纳斯指出这一点!

最新更新