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

B2C单点登录应用注册是否需要自定义范围?

问题:Azure AD B2C 为何必须配置自定义范围才能获取访问令牌?

我发现只有在应用注册的「公开API」部分定义自定义范围后,才能从Azure AD B2C获取访问令牌,配置界面如下:
应用注册公开API自定义范围配置界面

我无法理解为什么需要这个自定义范围:

  • 我已经为应用授权了Microsoft Graph权限,用户完成单点登录并授权应用代表其操作后,应用本应可以读取用户配置文件,且B2C应该能在令牌中返回邮箱等用户信息。
  • 但如果省略自定义范围,仅使用openid这类范围时,会收到错误:

AADB2C90055: 请求中提供的范围 'openid' 必须指定资源,例如 'https://example.com/calendar.read'。


核心原因:Azure AD B2C 对访问令牌的资源绑定要求

Azure AD B2C 里,openid是用来获取ID令牌的范围,不是访问令牌。当你请求访问令牌时,B2C要求必须明确指定目标资源(比如你的自有API、Microsoft Graph),自定义范围本质是给你的应用自身定义的资源标识——这是B2C区分不同访问令牌受众的核心机制。

分点拆解:

  1. ID令牌与访问令牌的差异

    • 只用openid范围时,B2C只会返回ID令牌(用于身份验证,包含邮箱、姓名等用户基本信息),不会返回访问令牌。你遇到的错误,是因为你在请求访问令牌,但没指定对应的资源范围。
    • 如果只是需要获取用户身份信息,不需要访问令牌,直接用openid profile email范围就能拿到包含这些信息的ID令牌,完全不需要自定义范围。
  2. 自定义范围的实际作用

    • 当你需要访问令牌调用自有API时,自定义范围是B2C标记令牌受众(即你的API)的方式——令牌的aud(受众)字段会被设为你的应用ID URI,自定义范围则出现在scp字段里,供API验证权限。
    • 如果要调用Microsoft Graph,不需要自定义范围,直接用Graph的官方范围就行,比如https://graph.microsoft.com/User.Read,此时B2C会返回针对Graph的访问令牌。
  3. 关于你配置的Graph权限

    • 你给应用授权的Graph权限是应用权限还是委派权限?如果是委派权限,请求时必须指定Graph的具体范围(比如https://graph.microsoft.com/User.Read),不能只依赖openid。
    • 要是想在ID令牌里拿到邮箱等信息,得确保你的B2C用户流(或自定义策略)已经配置了这些声明的输出,同时请求范围包含profile email。

解决建议:

  • 仅需用户身份信息(无需访问令牌):请求范围用openid profile email,直接获取ID令牌即可,无需自定义范围。
  • 需调用自有API:必须在「公开API」中定义自定义范围,请求时包含该范围(格式通常为{你的应用ID URI}/{自定义范围名称})。
  • 需调用Microsoft Graph:请求范围使用Graph的官方范围(如https://graph.microsoft.com/User.Read),无需自定义范围,同时确保用户流/策略允许获取这些权限。

内容的提问来源于stack exchange,提问作者Anton Putau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:52:23