Angular 5应用查询Azure AD应用角色与组声明的问题
解决Azure AD B2C + Angular 5中获取用户/组数据的问题
我来帮你梳理下你遇到的核心问题和具体解决步骤——你现在的困境主要是混淆了Azure AD B2C与普通Azure AD的数据源边界,同时在权限类型、API端点选择上踩了几个常见的坑:
核心问题拆解
- 数据源隔离:Azure AD B2C的用户、组是独立于你的主Azure AD租户的,你用B2C应用登录获取的用户委托令牌,默认只能访问当前登录用户的个人信息,根本没有权限读取租户内的所有用户/组。
- 应用类型选错:
apps.dev.microsoft.com注册的是个人Microsoft应用,完全不适合Azure AD B2C这种企业级的用户管理场景。 - 权限类型错误:你之前尝试的都是用户委托权限,但要获取全租户的用户/组,必须用应用权限(而非用户登录时的委托权限)。
具体解决步骤
1. 注册正确的Azure AD应用
别再用B2C应用或个人Microsoft应用了,去你的主Azure AD租户(不是B2C的用户流界面)注册一个专门用于数据访问的应用:
- 打开Azure门户 → 进入「Azure Active Directory」→ 「应用注册」→ 「新建注册」。
- 填写应用名称,账户类型选「仅此组织目录中的账户」(对应你的B2C租户所在的Azure AD目录)。
2. 配置Microsoft Graph应用权限
这个新应用需要申请应用权限才能读取B2C租户的所有用户和组:
- 进入应用的「API权限」页面 → 「添加权限」→ 选「Microsoft Graph」→ 切换到「应用权限」标签。
- 勾选你需要的权限:
User.Read.All:读取所有用户信息Group.Read.All:读取所有组信息
- 点击「授予管理员同意」(必须由租户管理员操作,否则权限不会生效)。
3. 获取应用权限令牌(注意:别在前端暴露密钥!)
因为是应用权限,不能用用户登录的方式拿令牌,得用客户端ID+客户端密钥(或证书)走客户端凭据流。建议你在后端服务里实现这个逻辑,前端调用后端接口来获取数据,避免在浏览器里暴露敏感的客户端密钥:
POST https://login.microsoftonline.com/{你的B2C租户ID}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id={你的应用客户端ID} &scope=https://graph.microsoft.com/.default &client_secret={你的应用客户端密钥} &grant_type=client_credentials
4. 调用正确的Microsoft Graph端点
拿到令牌后,就可以调用标准的Microsoft Graph端点获取数据了:
- 获取所有用户:
GET https://graph.microsoft.com/v1.0/users - 获取所有组:
GET https://graph.microsoft.com/v1.0/groups
提示:不管你有多少个B2C用户流,所有用户数据都会统一在这些端点下返回。
5. 可选:登录时直接获取组/角色声明
如果不想每次都调用Graph,希望用户登录后ID令牌里直接带组或应用角色信息,可以这么做:
- 组声明配置:进入B2C租户 → 「用户流」→ 选中你的登录/注册流 → 「用户属性」添加「组」,再到「应用程序声明」里勾选「组」,选择返回组ID或名称。
- 应用角色配置:在B2C应用注册里添加应用角色,把用户/组分配到对应角色,再在用户流里配置应用角色声明,这样登录后令牌里就会包含角色信息。
避坑提醒
- 别用B2C应用的客户端ID申请应用权限:B2C应用是给用户登录用的,不支持应用权限模式。
- 彻底放弃
graph.windows.net:这个旧端点已经被弃用了,所有Azure AD/B2C操作都要迁移到Microsoft Graph。 - Graph Explorer测试注意:默认是用用户委托权限,只能看到当前用户;要测试应用权限,得在Graph Explorer里切换到应用权限模式,用你刚注册的应用凭据。
内容的提问来源于stack exchange,提问作者afriedman111
相关产品推荐
相关产品推荐

