Azure AD B2C自定义策略获取强认证设备报Bad request错误
问题描述
搭建支持TOTP的Azure AD B2C自定义策略登录流程时,参考官方MFA自定义策略文档完成TRUSTFRAMEWORKEXTENSIONS文件修改后,测试流程中提交邮箱、密码后页面直接跳转回业务站点。查看审计日志发现活动类型为*"Get available strong authentication devices"的ClientError,错误原因为"The service received a bad request"*。
涉及的技术配置文件(Technical Profile)如下:
<TechnicalProfile Id="AzureMfa-GetAvailableDevices"> <DisplayName>Get Available Devices</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.AzureMfaProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="Operation">GetAvailableDevices</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="userPrincipalName" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="numberOfAvailableDevices" /> </OutputClaims> </TechnicalProfile>
对应的编排步骤(Orchestration Step)配置如下:
<OrchestrationStep Order="2" Type="ClaimsExchange"> <Preconditions> <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> <Value>newUser</Value> <Value>True</Value> <Action>SkipThisOrchestrationStep</Action> </Precondition> </Preconditions> <ClaimsExchanges> <ClaimsExchange Id="CheckAvailableDevices" TechnicalProfileReferenceId="AzureMfa-GetAvailableDevices" /> </ClaimsExchanges> </OrchestrationStep>
现有配置的明显问题
- 输入声明缺失必填字段:
AzureMfa-GetAvailableDevices调用MFA服务接口时,除userPrincipalName外强制要求传入tenantId作为入参,当前InputClaims节点仅配置了UPN,请求缺少租户上下文会直接被服务端判定为坏请求。 - TOTP场景元数据缺失:默认的GetAvailableDevices操作仅查询短信、语音类MFA设备,要支持TOTP认证方式必须在Metadata节点添加
<Item Key="IncludeTOTPDevices">True</Item>配置,未添加时请求参数和服务端TOTP接口的校验规则不匹配。 - 前置校验逻辑不完善:当前编排步骤仅配置了新用户跳过规则,没有校验前序密码校验步骤是否成功执行、
userPrincipalName是否已被正确写入声明包,若前序步骤异常导致UPN值为空,调用MFA接口时必然触发坏请求错误。
后续排查方向
- 开启Application Insights日志追踪,抓取
AzureMfa-GetAvailableDevices执行时的完整声明包,确认调用发生时userPrincipalName是否存在有效值、tenantId/objectId等必填字段是否缺失。 - 核对前序本地账号登录的技术配置,确认密码校验通过后是否正确输出
userPrincipalName声明,排查是否存在声明映射错误、声明名称不匹配导致的UPN传值失败问题。 - 核对基础策略文件中的ClaimType定义,确认用到的
userPrincipalName、numberOfAvailableDevices等声明在基础层和扩展层的定义一致,避免声明序列化异常导致的请求参数格式错误。 - 临时移除编排步骤的前置条件,使用已预先配置好TOTP认证方式的测试用户走流程,排除
newUser标记判断逻辑异常导致的流程分支错误。
内容的提问来源于stack exchange,提问作者Nait
相关产品推荐
相关产品推荐

