You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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.com authority格式。
  • 访问令牌是绑定特定API的资源令牌,只有指定目标API的范围,B2C才会返回该类型令牌,否则仅返回用于身份验证的ID令牌和刷新令牌。

内容的提问来源于stack exchange,提问作者Cj S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:06:11