如何通过MSAL与Azure B2C获取含角色和组的访问令牌?
解决Azure B2C自定义策略获取含角色/组的访问令牌问题
1. 配置目标Web API应用
- 在Azure B2C中注册一个Web API应用(作为访问令牌的目标资源),进入该应用的公开API选项卡,定义自定义范围(如
access_as_user),记录下API的Application ID URI(格式通常为https://<tenant>.onmicrosoft.com/<api-app-id>)。 - 回到你的客户端登录应用,在API权限中添加上述Web API的权限,勾选你定义的范围并完成管理员同意授予。
2. 调整MSAL请求参数
- 保持B2C官方格式的
authority:https://<tenant>.b2clogin.com/<tenant>.onmicrosoft.com/<policy-name> - 在MSAL登录请求的
scopes参数中,必须包含目标API的具体范围,示例如下:
仅传// MSAL.js 请求配置示例 const loginRequest = { scopes: ["https://<tenant>.onmicrosoft.com/<api-app-id>/access_as_user", "openid", "offline_access"] };openid等身份范围无法触发访问令牌返回,必须指定目标API的专属范围。
3. 自定义策略中添加角色/组声明到访问令牌
- 打开自定义策略XML文件,找到
<RelyingParty>节点下的PolicyProfile技术配置文件,在<OutputClaims>中添加角色和组的声明映射:<OutputClaim ClaimTypeReferenceId="roles" PartnerClaimType="roles" /> <OutputClaim ClaimTypeReferenceId="groups" PartnerClaimType="groups" /> - 确保策略已配置读取用户角色/组的逻辑:在读取用户信息的技术配置文件(如
AAD-UserReadUsingObjectId)中,添加对应属性的声明输出,示例:
(若角色/组存储在自定义扩展属性中,需替换为对应的属性名称,如<OutputClaim ClaimTypeReferenceId="roles" PartnerClaimType="roles" /> <OutputClaim ClaimTypeReferenceId="groups" PartnerClaimType="groups" />extension_userRoles)
4. 验证令牌内容
登录成功后通过MSAL获取accessToken,可使用jwt.ms解析令牌,确认roles和groups声明已包含在访问令牌中。
关键提示
- 禁止使用已弃用的
login.microsoftonline.com端点,必须使用B2C官方的b2clogin.comauthority格式。 - 访问令牌是绑定特定API的资源令牌,只有指定目标API的范围,B2C才会返回该类型令牌,否则仅返回用于身份验证的ID令牌和刷新令牌。
内容的提问来源于stack exchange,提问作者Cj S.
相关产品推荐
相关产品推荐

