Azure B2C自定义策略:MFA重试限制与账号锁定配置咨询
自定义登录旅程MFA配置与账号锁定方案
现有疑问解答
1. 电话呼叫MFA的取消/重试逻辑
- 默认流程下,未接听或输入错误密钥后,系统会自动挂断并返回对应错误码(如
invalid_code、call_failed)。若要实现取消或重试,需在自定义用户旅程中添加自定义步骤:- 在呼叫发起页面添加「取消」按钮,触发旅程分支跳转回MFA方式选择页。
- 重试逻辑通过策略中的
ClaimsExchange和UserJourney分支实现,允许用户在呼叫失败后重新发起请求,而非直接返回错误。
2. SMS MFA的限额与失败次数配置
- 开发租户的SMS发送限额属于免费套餐限制,生产租户会根据订阅配额提升上限。
- 会话内失败尝试次数需在对应SMS验证的**技术配置文件(Technical Profile)**中修改:
找到PhoneFactor-InputOrVerify节点,添加重试限制参数及自定义错误提示:<TechnicalProfile Id="PhoneFactor-InputOrVerify"> <Metadata> <Item Key="RetryLimit">5</Item> <Item Key="UserMessageIfMaxAllowedCodeRetryReached">短信验证码重试次数已达上限,请稍后再试。</Item> </Metadata> </TechnicalProfile>
3. Email MFA的错误尝试次数配置
- 内置邮箱验证的错误次数可配置。在对应Email验证的技术配置文件(如
EmailVerification-InputVerifyCode)中,通过Metadata节点设置RetryLimit参数:<TechnicalProfile Id="EmailVerification-InputVerifyCode"> <Metadata> <Item Key="RetryLimit">5</Item> </Metadata> </TechnicalProfile>
统一失败次数限制与账号锁定实现方案
1. 跟踪MFA失败次数
通过**会话声明(Session Claim)**跟踪每种MFA方式的失败次数:
- 为三种MFA方式分别定义声明:
phoneMfaFailedCount、smsMfaFailedCount、emailMfaFailedCount。 - 每次验证失败时,通过
ClaimsTransformation递增对应声明数值:<ClaimsTransformation Id="IncrementPhoneMfaFailedCount" TransformationMethod="AddIntegerClaim"> <InputClaims> <InputClaim ClaimTypeReferenceId="phoneMfaFailedCount" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="add" DataType="int" Value="1" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="phoneMfaFailedCount" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
2. 触发锁定与日志记录
当失败次数达到5次时,执行以下操作:
- 显示错误信息:在对应技术配置文件中通过
UserMessageIfMaxAllowedCodeRetryReached配置提示文案。 - 调用后端API记录日志:使用
RestfulProvider技术配置文件发起POST请求,传递用户ID、MFA方式、失败次数等信息:<TechnicalProfile Id="LogMfaLockout"> <DisplayName>Log MFA Lockout Event</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://your-backend-api.com/log-mfa-lockout</Item> <Item Key="AuthenticationType">None</Item> <Item Key="SendClaimsIn">Body</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="objectId" /> <InputClaim ClaimTypeReferenceId="mfaMethod" /> <InputClaim ClaimTypeReferenceId="failedCount" /> </InputClaims> </TechnicalProfile> - 24小时账号锁定:通过
ClaimsTransformation生成锁定到期时间(当前时间+24小时),并存储到用户目录扩展属性extension_mfaLockoutUntil中。同时在用户旅程起始步骤添加验证逻辑,若属性未过期则阻止登录:<ClaimsTransformation Id="CalculateLockoutExpiry" TransformationMethod="AddHoursToDateTime"> <InputClaims> <InputClaim ClaimTypeReferenceId="currentDateTime" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="hoursToAdd" DataType="int" Value="24" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="extension_mfaLockoutUntil" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
3. 整合到用户旅程
在自定义用户旅程的MFA验证步骤中添加分支判断:
- 每次验证失败后,递增对应失败次数声明,判断是否达到5次。
- 达到次数上限时,调用日志API、设置锁定时间,跳转至错误页面;未达到则允许用户重试。
内容的提问来源于stack exchange,提问作者Erkan Y.
相关产品推荐
相关产品推荐

