在 Azure AD B2C 自定义策略中定义一次性密码技术配置文件

重要

自 2025 年 5 月 1 日起,Azure AD B2C 将不再可供新客户购买。 在我们的常见问题解答中了解详细信息

备注

在 Azure Active Directory B2C 中,自定义策略 主要用于解决复杂场景。 对于大多数场景,我们建议您使用内置的用户流。 如果未这样做,请通过 Active Directory B2C 中的自定义策略入门来了解自定义策略初学者包。

Azure Active Directory B2C(Azure AD B2C)支持管理一次性密码的生成和验证。 使用技术配置文件生成代码,然后稍后验证代码。

一次性密码技术配置文件还可以在代码验证期间返回错误消息。 使用 验证技术配置文件设计与一次性密码的集成。 验证技术配置文件调用一次性密码技术配置文件来验证代码。 验证技术配置文件在用户旅程继续之前验证用户提供的数据。 使用验证技术配置文件时,错误消息会显示在自断言页面上。

协议

“Protocol”元素的“Name”属性必须设置为 处理程序属性必须包含 Azure AD B2C 使用的协议处理程序程序集的完全限定名称:

Web.TPEngine.Providers.OneTimePasswordProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

以下示例显示了一次性密码技术配置文件:

<TechnicalProfile Id="VerifyCode">
  <DisplayName>Validate user input verification code</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.OneTimePasswordProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  ...

生成代码

此技术配置文件的第一种模式是生成代码。 下面是可为此模式配置的选项。 在会话中跟踪生成的代码和尝试。

输入声明

InputClaims 元素包含发送到一次性密码协议提供程序所需的声明列表。 还可以将声明的名称映射到下面定义的名称。

ClaimReferenceId 必选 DESCRIPTION
标识符 是的 用于标识稍后需要验证代码的用户的标识符。 它通常用作将代码传递到的目标的标识符,例如电子邮件地址或电话号码。

InputClaimsTransformations 元素可能包含 InputClaimsTransformation 元素的集合,这些元素用于在发送到一次性密码协议提供程序之前修改输入声明或生成新声明。

输出声明

OutputClaims 元素包含由一次性密码协议提供程序生成的声明列表。 还可以将声明的名称映射到下面定义的名称。

ClaimReferenceId 必选 DESCRIPTION
otpGenerated 是的 生成的代码,其会话由 Azure AD B2C 管理。

OutputClaimsTransformations 元素可能包含用于修改输出声明或生成新输出声明的 OutputClaimsTransformation 元素集合。

元数据

以下设置可用于配置代码生成模式:

特征 必选 DESCRIPTION
操作 是的 要执行的作。 可能的值:GenerateCode
CodeExpirationInSeconds 代码过期前的时间(以秒为单位)。 最小值: 60;最大值: 1200;默认值: 600. 每次提供代码(使用 ReuseSameCode相同代码或新代码)时,都会延长代码过期时间。 这一次还用于设置重试超时(达到最大尝试次数后,用户被锁定,无法尝试获取新代码,直到此时间过期)
CodeLength 代码的长度。 默认值是 6
CharacterSet 代码的字符集,格式设置为在正则表达式中使用。 例如,a-z0-9A-Z。 默认值是 0-9。 字符集必须在指定的集中至少包含 10 个不同的字符。
NumRetryAttempts 在代码被视为无效之前,验证尝试次数。 默认值是 5。 例如,如果将 NumRetryAttempts 设置为 2,则只允许总共 2 次尝试(第一次 + 1 次重试)。 对于第三次尝试,无论代码是否正确,都会引发达到的最大尝试次数。
NumCodeGenerationAttempts 每个标识符的最大代码生成尝试次数。 如果未指定默认值,则为默认值 10
ReuseSameCode 是否应提供相同的代码,而不是在给定代码未过期且仍然有效时生成新代码。 默认值是 false

示例:

以下示例 TechnicalProfile 用于生成代码:

<TechnicalProfile Id="GenerateCode">
  <DisplayName>Generate Code</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.OneTimePasswordProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="Operation">GenerateCode</Item>
    <Item Key="CodeExpirationInSeconds">600</Item>
    <Item Key="CodeLength">6</Item>
    <Item Key="CharacterSet">0-9</Item>
    <Item Key="NumRetryAttempts">5</Item>
    <Item Key="NumCodeGenerationAttempts">10</Item>
    <Item Key="ReuseSameCode">false</Item>
  </Metadata>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="identifier" PartnerClaimType="identifier" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="otpGenerated" PartnerClaimType="otpGenerated" />
  </OutputClaims>
</TechnicalProfile>

验证验证码

此技术配置文件的第二种模式是验证代码。 下面是可为此模式配置的选项。

输入声明

InputClaims 元素包含发送到一次性密码协议提供程序所需的声明列表。 还可以将声明的名称映射到下面定义的名称。

ClaimReferenceId 必选 DESCRIPTION
标识符 是的 用于标识以前生成代码的用户的标识符。 它通常用作将代码传递到的目标的标识符,例如电子邮件地址或电话号码。
otpToVerify 是的 用户提供的验证码。

InputClaimsTransformations 元素可能包含 InputClaimsTransformation 元素的集合,这些元素用于在发送到一次性密码协议提供程序之前修改输入声明或生成新声明。

输出声明

此协议提供程序的代码验证期间不提供任何输出声明。

OutputClaimsTransformations 元素可能包含用于修改输出声明或生成新输出声明的 OutputClaimsTransformation 元素集合。

元数据

以下设置可用于代码验证模式:

特征 必选 DESCRIPTION
操作 是的 要执行的作。 可能的值:VerifyCode

UI 元素

以下元数据可用于配置代码验证失败时显示的错误消息。 应在 自断言 技术配置文件中配置元数据。 可以将错误消息本地化

特征 必选 DESCRIPTION
UserMessageIfSessionDoesNotExist 如果代码验证会话已过期,则向用户显示的消息。 它是代码已过期,或者从未为给定标识符生成代码。
UserMessageIfMaxRetryAttempted 如果用户超过允许的最大验证尝试数,则向用户显示的消息。
UserMessageIfMaxNumberOfCodeGenerated 当代码生成超出了允许的最大尝试次数时显示给用户的消息。
UserMessageIfInvalidCode 如果用户提供了无效代码,则向用户显示的消息。
UserMessageIfVerificationFailedRetryAllowed 如果用户提供了无效代码,并且允许用户提供正确的代码,则向用户显示的消息。
UserMessageIfSessionConflict 如果无法验证代码,则向用户显示的消息。

示例:

以下示例 TechnicalProfile 用于验证代码:

<TechnicalProfile Id="VerifyCode">
  <DisplayName>Verify Code</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.OneTimePasswordProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="Operation">VerifyCode</Item>
  </Metadata>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="identifier" PartnerClaimType="identifier" />
    <InputClaim ClaimTypeReferenceId="otpGenerated" PartnerClaimType="otpToVerify" />
  </InputClaims>
</TechnicalProfile>