Azure AD B2C自定义策略中获取OAuth2 Bearer令牌并调用安全API传递用户声明的问题排查
解决方案:Azure AD B2C自定义策略中调用带Bearer认证的REST API
首先直接给结论:你确实需要同时调用这两个REST技术配置文件,而且必须按照「先获取AccessToken,再调用业务API」的顺序来执行。下面帮你拆解问题原因和正确的配置方式:
问题原因分析
- 单独调用
REST-API-SignUp报错:因为这个技术配置文件依赖bearerToken声明生成Bearer认证头,但此时这个声明还未被创建,自然会提示找不到。 - 同时调用上传失败:大概率是你在用户旅程中对两个技术配置文件的调用方式不正确(比如步骤顺序错误,或者未确保声明能在步骤间传递)。
正确的配置方式
1. 确保bearerToken声明已定义
首先检查你的ClaimsSchema里是否有这个声明,如果没有,添加进去:
<ClaimsSchema> <ClaimType Id="bearerToken"> <DisplayName>Bearer Token for API</DisplayName> <DataType>string</DataType> <AdminHelpText>Store the access token acquired for calling the secure API</AdminHelpText> </ClaimType> <!-- 其他已有的声明... --> </ClaimsSchema>
2. 在用户旅程中按顺序调用两个技术配置文件
你有两种可选的调用方式:
方式一:将两个ClaimsExchange放在同一个OrchestrationStep中
这种方式会在同一个步骤里先执行获取token,再调用业务API:
<OrchestrationStep Order="8" Type="ClaimsExchange"> <ClaimsExchanges> <!-- 第一步:获取AccessToken,存入bearerToken声明 --> <ClaimsExchange Id="AcquireAPIToken" TechnicalProfileReferenceId="REST-AcquireAccessToken" /> <!-- 第二步:使用bearerToken调用业务API --> <ClaimsExchange Id="RESTPostUserClaims" TechnicalProfileReferenceId="REST-API-SignUp" /> </ClaimsExchanges> </OrchestrationStep>
方式二:分成两个连续的OrchestrationStep
如果你需要在两个步骤之间添加其他逻辑,也可以分成两个步骤:
<!-- 步骤8:获取AccessToken --> <OrchestrationStep Order="8" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="AcquireAPIToken" TechnicalProfileReferenceId="REST-AcquireAccessToken" /> </ClaimsExchanges> </OrchestrationStep> <!-- 步骤9:调用业务API --> <OrchestrationStep Order="9" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="RESTPostUserClaims" TechnicalProfileReferenceId="REST-API-SignUp" /> </ClaimsExchanges> </OrchestrationStep>
3. 额外的检查项
- 确认
REST-AcquireAccessToken中的scope值正确:必须是你注册的API应用的/.default范围,格式为https://{tenant}.onmicrosoft.com/{api-client-id}/.default - 检查密钥容器中的
B2C_1A_SecureRESTClientId和B2C_1A_SecureRESTClientSecret是否正确对应API应用的客户端ID和密钥 - 确保API应用已经授予了你的B2C策略应用(调用token端点的应用)对应的应用权限,并且已经完成管理员同意
为什么之前的同时调用会失败?
如果之前你尝试同时调用但上传失败,可能是以下原因:
- 两个步骤的顺序反了:先调用了业务API再获取token
bearerToken声明未在ClaimsSchema中定义,导致策略无法识别这个声明
按照上面的配置调整后,应该就能顺利获取token并调用你的安全API了。
内容的提问来源于stack exchange,提问作者Munazza Osama
相关产品推荐
相关产品推荐

