B2C单点登录应用注册是否需要自定义范围?
问题:Azure AD B2C 为何必须配置自定义范围才能获取访问令牌?
我发现只有在应用注册的「公开API」部分定义自定义范围后,才能从Azure AD B2C获取访问令牌,配置界面如下:
我无法理解为什么需要这个自定义范围:
- 我已经为应用授权了Microsoft Graph权限,用户完成单点登录并授权应用代表其操作后,应用本应可以读取用户配置文件,且B2C应该能在令牌中返回邮箱等用户信息。
- 但如果省略自定义范围,仅使用
openid这类范围时,会收到错误:
AADB2C90055: 请求中提供的范围 'openid' 必须指定资源,例如 'https://example.com/calendar.read'。
核心原因:Azure AD B2C 对访问令牌的资源绑定要求
Azure AD B2C 里,openid是用来获取ID令牌的范围,不是访问令牌。当你请求访问令牌时,B2C要求必须明确指定目标资源(比如你的自有API、Microsoft Graph),自定义范围本质是给你的应用自身定义的资源标识——这是B2C区分不同访问令牌受众的核心机制。
分点拆解:
ID令牌与访问令牌的差异
- 只用
openid范围时,B2C只会返回ID令牌(用于身份验证,包含邮箱、姓名等用户基本信息),不会返回访问令牌。你遇到的错误,是因为你在请求访问令牌,但没指定对应的资源范围。 - 如果只是需要获取用户身份信息,不需要访问令牌,直接用
openid profile email范围就能拿到包含这些信息的ID令牌,完全不需要自定义范围。
- 只用
自定义范围的实际作用
- 当你需要访问令牌调用自有API时,自定义范围是B2C标记令牌受众(即你的API)的方式——令牌的
aud(受众)字段会被设为你的应用ID URI,自定义范围则出现在scp字段里,供API验证权限。 - 如果要调用Microsoft Graph,不需要自定义范围,直接用Graph的官方范围就行,比如
https://graph.microsoft.com/User.Read,此时B2C会返回针对Graph的访问令牌。
- 当你需要访问令牌调用自有API时,自定义范围是B2C标记令牌受众(即你的API)的方式——令牌的
关于你配置的Graph权限
- 你给应用授权的Graph权限是应用权限还是委派权限?如果是委派权限,请求时必须指定Graph的具体范围(比如
https://graph.microsoft.com/User.Read),不能只依赖openid。 - 要是想在ID令牌里拿到邮箱等信息,得确保你的B2C用户流(或自定义策略)已经配置了这些声明的输出,同时请求范围包含
profile email。
- 你给应用授权的Graph权限是应用权限还是委派权限?如果是委派权限,请求时必须指定Graph的具体范围(比如
解决建议:
- 仅需用户身份信息(无需访问令牌):请求范围用
openid profile email,直接获取ID令牌即可,无需自定义范围。 - 需调用自有API:必须在「公开API」中定义自定义范围,请求时包含该范围(格式通常为
{你的应用ID URI}/{自定义范围名称})。 - 需调用Microsoft Graph:请求范围使用Graph的官方范围(如
https://graph.microsoft.com/User.Read),无需自定义范围,同时确保用户流/策略允许获取这些权限。
内容的提问来源于stack exchange,提问作者Anton Putau
相关产品推荐
相关产品推荐

