Azure AD B2C异常未渲染api.error自定义错误页如何解决
Azure AD B2C 第三方登录拒绝授权跳转自定义错误页方案
问题现象
- 接入Google、Facebook等第三方登录自定义登录页流程时,用户在第三方授权同意页点击同意,可正常重定向到业务站点首页;用户点击拒绝授权时,系统默认跳转回登录页,需求为将该场景跳转目标改为自定义错误页
- 尝试通过新增用户旅程编排步骤处理该逻辑未生效
- 按照官方文档配置的
api.error全局错误页未正常加载,异常触发时始终显示登录界面,自定义错误页地址无请求记录
已捕获的异常信息
Application Insights中记录的异常详情如下:
"Exception": { "Kind": "Handled", "HResult": "80131500", "Message": "An invalid response was received : 'Error: access_denied,Error Description: ConsentNotGiven'", "Data": { "IsPolicySpecificError": false } }
当前api.error内容定义配置如下:
<ContentDefinition Id="api.error"> <LoadUri>~/tenant/templates/AzureBlue/exception.cshtml</LoadUri> <RecoveryUri>~/common/default_page_error.html</RecoveryUri> <DataUri>urn:com:microsoft:aad:b2c:elements:contract:globalexception:1.2.1</DataUri> <Metadata> <Item Key="DisplayName">Error page</Item> </Metadata> </ContentDefinition>
根因说明
- 第三方身份提供者返回的
access_denied(用户拒绝授权)属于Azure AD B2C标记为Handled的内置业务异常,不会触发全局未捕获异常对应的api.error页面渲染逻辑,异常发生在联邦IdP回调的前置校验阶段,早于用户旅程编排步骤的执行链路,因此直接新增编排步骤无法捕获该异常。 - 当前使用的
globalexception:1.2.1版本DataUri存在已知的自定义LoadUri加载失效bug,同时CDN缓存、策略继承覆盖也会导致全局错误页配置不生效。
实现步骤
- 拦截第三方授权拒绝的默认处理逻辑
在Google、Facebook等对应OAuth2身份提供者的技术配置文件<Metadata>节点下新增如下配置,关闭B2C对access_denied响应的自动跳转逻辑:
配置生效后,B2C不会自动将用户打回登录页,会将<Item Key="DefaultUserMessageIfAccessDenied">unused</Item>oauth2_error、oauth2_error_description两个错误声明写入声明集合,流转到后续编排步骤。 - 新增授权拒绝场景的判断逻辑
在第三方登录授权步骤的下一个位置新增编排步骤,通过声明转换判断错误声明:- 当检测到
oauth2_error值为access_denied,且oauth2_error_description包含ConsentNotGiven时,可选择两种处理方式:- 抛出自定义错误码,触发全局错误页渲染
- 直接跳转至配置好的自定义错误页自断言步骤
- 当检测到
- 修复全局错误页不生效问题
- 将
api.error配置中的DataUri升级到urn:com:microsoft:aad:b2c:elements:contract:globalexception:1.2.14及以上稳定版本 - 确认
api.error的ContentDefinition节点位于所有ContentDefinition配置的最靠前位置,未被子策略文件的同名配置覆盖LoadUri - 上传策略后清除浏览器缓存、B2C页面CDN缓存后再测试,旧版本页面资源缓存最长保留24小时
- 将
内容的提问来源于stack exchange,提问作者Tanveer Ansari
相关产品推荐
相关产品推荐

