

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 向用户池添加 MFA
<a name="user-pool-settings-mfa"></a>

MFA 将*您具有的某种* 身份验证因素添加到*您已知的* 初始因素（通常是用户名和密码）中。对于使用密码作为主要身份验证因素的用户，您可以选择将短信文本消息、电子邮件消息或基于时间的一次性密码（TOTP）作为他们登录的额外安全因素。

多重身份验证（MFA）可提高应用程序中[本地用户](cognito-terms.md#terms-localuser)的安全性。对于[联合用户](cognito-terms.md#terms-federateduser)，Amazon Cognito 会将所有身份验证过程委托给 IdP，并且不会为他们提供额外的身份验证因素。

**注意**  
即使您的用户池需要 MFA，新用户首次登录您的应用程序时，Amazon Cognito 也会发放 OAuth 2.0 令牌。您的用户首次登录时的第二个身份验证因素是他们对 Amazon Cognito 发送给他们的验证消息的确认。如果您的用户池要求使用 MFA，Amazon Cognito 会提示您的用户注册一个额外的登录因素，以便在第一次之后的每次登录尝试期间使用。

借助自适应身份验证，可以将用户池配置为响应增加的风险级别需要额外的身份验证因素。要向用户池添加自适应身份验证，请参阅 [具备威胁防护的高级安全功能](cognito-user-pool-settings-threat-protection.md)。

将用户池的 MFA 设置为 `required` 时，所有用户都必须完成 MFA 才能登录。要登录，每个用户至少设置一个 MFA 安全因素。当需要进行 MFA 时，您必须在用户引导中包含 MFA 设置，以便您的用户池允许他们登录。

当您将 MFA 设置为必需时，托管登录会提示用户设置 MFA。当您在用户池中将 MFA 设置为可选时，托管登录不会提示用户。要使用可选的 MFA，您必须在应用程序中构建一个界面，以提示用户选择他们需要设置 MFA，然后引导他们完成 API 输入以验证他们的额外登录因素。

**Topics**
+ [有关用户池 MFA 的需知信息](#user-pool-settings-mfa-prerequisites)
+ [用户 MFA 首选项](#user-pool-settings-mfa-preferences)
+ [用户运行时的 MFA 逻辑详情](#user-pool-settings-mfa-user-outcomes)
+ [为用户池配置多重身份验证](#user-pool-configuring-mfa)
+ [短信和电子邮件消息 MFA](user-pool-settings-mfa-sms-email-message.md)
+ [TOTP 软件令牌 MFA](user-pool-settings-mfa-totp.md)

## 有关用户池 MFA 的需知信息
<a name="user-pool-settings-mfa-prerequisites"></a>

在设置 MFA 之前，请考虑以下情况：
+ *用户可以拥有 MFA，也可以使用无密码因素登录，但有一个例外：当您在用户池中设置为时，带有用户验证功能的密钥可以满足 MFA 要求。* `FactorConfiguration` `MULTI_FACTOR_WITH_USER_VERIFICATION` `WebAuthnConfiguration`
  + 在支持[一次性](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)密码的用户池中，您不能将 MFA 设置为必填项。
  + 当您的用户池中需要 MFA `AllowedFirstAuthFactors` 时，您无法添加`EMAIL_OTP`或`SMS_OTP`。您可以添加`WEB_AUTHN`何时设置`FactorConfiguration`为`MULTI_FACTOR_WITH_USER_VERIFICATION`。
  + 当用户池要求启用 MFA 时，所有应用程序客户端中[基于选择的登录](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)仅提供 `PASSWORD` 和 `PASSWORD_SRP` 两种因素。有关用户名密码流程的更多信息，请参阅本指南**身份验证**一章中的[使用永久密码登录](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password)和[使用永久密码和安全有效载荷登录](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp)。
  + 在 MFA 为可选的用户池中，已配置 MFA 因素的用户在使用基于选择的登录时，只能通过用户名密码的身份验证流程进行登录。这些用户有资格使用所有[基于客户端的登录](authentication-flows-selection-sdk.md#authentication-flows-selection-client)流程。

  下表描述了用户池的 MFA 设置及用户对 MFA 因素的配置对用户使用无密码因素登录的能力的影响。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/user-pool-settings-mfa.html)
+ 用户首选 MFA 方法会影响他们可用于恢复密码的方法。首选 MFA 方式为电子邮件的用户无法通过电子邮件接收密码重置代码。首选 MFA 方式为短信的用户无法通过短信接收密码重置代码。

  当用户不符合条件，无法使用首选密码重置方法时，您的[密码恢复](managing-users-passwords.md#user-pool-password-reset-and-recovery)设置必须提供替代选项。例如，您的恢复机制可能将电子邮件列为第一优先选项，而电子邮件 MFA 可能是您的用户池中的一个选项。在这种情况下，添加短信消息账户恢复作为第二个选项，或者使用管理 API 操作为这些用户重置密码。

  对于没有有效恢复方式的用户发起的密码重置请求，Amazon Cognito 会返回 `InvalidParameterException` 错误响应。

  的示例请求正文[UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html#API_UpdateUserPool_Examples)说明了当电子邮件密码重置不可用时，用户可以通过短信回退到恢复状态。`AccountRecoverySetting`
+ 用户无法在同一电子邮件地址或电话号码上接收 MFA 验证码和密码重置验证码。如果他们使用电子邮件中的一次性密码 (OTPs) 进行 MFA，则必须使用 SMS 消息进行账户恢复。如果他们使用来 OTPs 自 SMS 消息的 MFA，则必须使用电子邮件进行账户恢复。在具有 MFA 的用户池中，如果用户有电子邮件地址的属性但没有电话号码，或者有电话号码但没有电子邮件地址，则他们可能无法完成自助密码恢复。

  要防止用户无法在使用此配置的用户池中重置密码的情况，请设置 `email` 和 `phone_number` [属性（按需设置）](user-pool-settings-attributes.md)。或者，您可以设置相关流程，在用户注册时或管理员创建用户配置文件时，始终收集并设置这些属性。当用户同时具备这两个属性时，Amazon Cognito 会自动将密码重置验证码发送到*不是*用户 MFA 因素的目的地。
+ 当您在用户池中激活 MFA 并选择**短信**或**电子邮件消息**作为第二安全因素时，可以向尚未在 Amazon Cognito 中验证的电话号码或电子邮件属性发送消息。用户完成 MFA 后，Amazon Cognito 会将其 `phone_number_verified` 或 `email_verified` 属性设置为 `true`。
+ 在五次尝试提交 MFA 代码均未成功后，Amazon Cognito 会开始如[失败登录尝试的锁定行为](authentication.md#authentication-flow-lockout-behavior)中所描述的指数超时锁定过程。
+ 如果您的账户位于包含您的用户池的亚马逊简单通知服务 (Amazon SNS) Simple Notification Service 资源的短信沙箱中，则必须先验证亚马逊 SNS 中的电话号码，然后才能发送短信。 AWS 区域 有关更多信息，请参阅 [Amazon Cognito 用户池的短信设置](user-pool-sms-settings.md)。
+ 为了更改用户的 MFA 状态以响应威胁防护功能检测到的事件，请激活 MFA 并在 Amazon Cognito 用户池控制台中将其设置为可选。有关更多信息，请参阅 [具备威胁防护的高级安全功能](cognito-user-pool-settings-threat-protection.md)。
+ 电子邮件和短信消息要求您的用户分别具有电子邮件地址和电话号码属性。您可以在用户池中将 `email` 或 `phone_number` 设置为必需的属性。在这种情况下，除非用户提供电话号码，否则他们无法完成注册。如果您未将这些属性设置为必需，但想要进行电子邮件或短信消息 MFA，则可以在用户注册时提示他们输入电子邮件地址或电话号码。妥善的做法是将用户池配置为自动向用户发送消息来[验证这些属性](signing-up-users-in-your-app.md)。

  如果用户通过短信或电子邮件成功接收了临时验证码，并在 [VerifyUserAttribute](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttribute.html)API 请求中返回了该验证码，则 Amazon Cognito 会将电话号码或电子邮件地址视为已验证。或者，您的团队可以设置电话号码，并使用执行 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html)API 请求的管理应用程序将其标记为已验证。
+ 如果您已将 MFA 设置为必需且激活了多个身份验证因素，则 Amazon Cognito 会提示新用户选择他们想要使用的 MFA 因素。用户必须有电话号码才能设置短信消息 MFA，必须有电子邮件地址才能设置电子邮件消息 MFA。如果用户没有为任何基于消息的可用 MFA 定义属性，则 Amazon Cognito 会提示他们设置 TOTP MFA。选择 MFA 因子 (`SELECT_MFA_TYPE`) 和设置所选因子 (`MFA_SETUP`) 的提示是对[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)和 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)API 操作的质询响应。

## 用户 MFA 首选项
<a name="user-pool-settings-mfa-preferences"></a>

用户可以设置多个 MFA 因素。只能激活一个因素。您可以在用户池设置中或从用户提示为用户选择有效的 MFA 首选项。当用户池设置和他们自己的用户级设置满足以下条件时，用户池会提示用户输入 MFA 验证码：

1. 您可以在用户池中将 MFA 设置为可选或必需。

1. 用户具有有效的 `email` 或 `phone_number` 属性，或者已为 TOTP 设置身份验证器应用程序。

1. 至少有一个 MFA 因素处于活动状态。

1. 一个 MFA 因素设置为首选。

### 禁止在登录和 MFA 中使用相同的系数
<a name="user-pool-settings-mfa-preferences-same-factor"></a>

可以配置您的用户池，使一个登录因子成为部分或所有用户唯一可用的登录和 MFA 选项。当您的主要登录用例是电子邮件或短信一次性密码 () 时，可能会出现此结果。OTPs在以下条件下，用户的首选 MFA 可能与其登录的因素类型相同：
+ 用户池中需要 MFA。
+ 用户池中提供电子邮件和短信 OTP 登录和 *MF* A 选项。
+ 用户使用电子邮件或短信 OTP 登录。
+ 它们有电子邮件地址属性但没有电话号码属性，或者有电话号码属性但没有电子邮件地址属性。

在这种情况下，用户可以使用电子邮件 OTP 登录，并使用电子邮件 OTP 完成 MFA。此选项取消了 MFA 的基本功能。使用一次性密码登录的用户必须能够使用与 MFA 不同的交付方式进行登录。当用户同时使用短信和电子邮件选项时，Amazon Cognito 会自动分配不同的因子。例如，当用户使用电子邮件 OTP 登录时，他们的首选 MFA 是短信 OTP。

当您的用户池支持登录和 MFA 的 OTP 身份验证时，请执行以下步骤来解决同因子身份验证问题。

1. 启用电子邮件和短信 OTP 作为登录因子。

1. 启用电子邮件和短信 OTP 作为 MFA 因子。

1. 收集

### 用户池设置及其对 MFA 选项的影响
<a name="user-pool-settings-mfa-preferences-things-to-know"></a>

用户池的配置会影响用户可以选择的 MFA 方法。以下是一些会影响用户设置 MFA 能力的用户池设置。
+ 在 Amazon Cognito 控制台**登录**菜单中的**多重身份验证**配置中，您可以将 MFA 设置为可选或必需，也可以将其关闭。与此设置的 API 等效项是`CreateUserPool``UpdateUserPool`、和的[MfaConfiguration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-MfaConfiguration)参数`SetUserPoolMfaConfig`。

  此外，在**多重身份验证**配置中，**MFA 方法**设置决定了用户可以设置的 MFA 因素。与该设置相当的 API 就是[SetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserPoolMfaConfig.html)操作。
+ 在**用户账户恢复**下的**登录**菜单中，您可以配置用户池向忘记密码的用户发送消息的方式。用户的 MFA 方法不能与用户池用于发送“忘记密码”验证码的 MFA 传送方式相同。忘记密码传送方法的 API 参数是和的[AccountRecoverySetting](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-AccountRecoverySetting)参数。`CreateUserPool` `UpdateUserPool`

  例如，当恢复选项为**仅使用电子邮件**时，用户无法设置电子邮件 MFA。这是因为在同一个用户池中，您无法既启用电子邮件 MFA 又将恢复选项设置为**仅使用电子邮件**。当您将此选项设置为**如果电子邮件可用，则使用电子邮件发送，否则使用短信**时，电子邮件是优先恢复选项，但是当用户不符合通过电子邮件进行恢复的条件时，您的用户池可以回退到短信形式。在这种情况下，用户可以将电子邮件 MFA 设置为首选，并且只在尝试重置密码时才接收短信。
+ 如果您只将一种 MFA 方法设置为可用，则无需管理用户 MFA 首选项。
+ 激活的短信配置会自动使短信成为用户池中的可用 MFA 方法。

  用户池中包含您自己的 Amazon SES 资源的有效[电子邮件配置](user-pool-email.md)以及基础版或增值版功能计划，可自动使电子邮件消息成为用户池中的可用 MFA 方法。
+ 在用户池中将 MFA 设置为必需时，用户无法启用或禁用任何 MFA 方法。您只能设置首选方法。
+ 当您在用户池中将 MFA 设置为可选时，托管登录不会提示用户设置 MFA，而是在用户拥有首选 MFA 方法时，提示用户输入 MFA 验证码。
+ 当您激活[威胁防护](cognito-user-pool-settings-threat-protection.md)并在全功能模式下配置自适应身份验证响应时，在您的用户池中 MFA 必须是可选的。自适应身份验证的其中一个响应选项是要求其登录尝试被评估为包含一定风险级别的用户进行 MFA。

  控制台的**注册**菜单中的**必填属性**设置决定了用户是否必须提供电子邮件地址或电话号码才能注册您的应用程序。当用户具有相应属性时，电子邮件和短信将成为符合条件的 MFA 因素。`CreateUserPool` 的 [Schema](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-Schema) 参数根据需要设置属性。
+ 当您在用户池中将 MFA 设置为必需且用户使用托管登录进行登录时，Amazon Cognito 会提示他们从用户池的可用方法中选择 MFA 方法。托管登录负责收集电子邮件地址或电话号码并设置 TOTP。下图展示了 Amazon Cognito 向用户提供的选项背后的逻辑。

### 为用户配置 MFA 首选项
<a name="user-pool-settings-mfa-preferences-configure"></a>

您可以在具有访问令牌授权的自助服务模式中为用户配置 MFA 首选项，或者在具有管理 API 操作的管理员管理模式中为用户配置 MFA 首选项。这些操作启用或禁用 MFA 方法，并将多种方法之一设置为首选选项。在用户设置 MFA 首选项后，Amazon Cognito 会在登录时提示他们提供来自他们首选 MFA 方法的验证码。未设置首选项的用户会收到在 `SELECT_MFA_TYPE` 质询中选择首选方法的提示。
+ 在用户自助服务模式或公共应用程序中 [SetUserMfaPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserMFAPreference.html)，使用登录用户的访问令牌进行授权，设置 MFA 配置。
+ 在管理员管理的应用程序或机密应用程序中，使用管理 AWS 凭证进行授权 [AdminSetUserPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserMFAPreference.html)，设置 MFA 配置。

您也可以从 Amazon Cognito 控制台的**用户**菜单中设置用户 MFA 首选项。有关 Amazon Cognito 用户池 API 中的公共和机密身份验证模式的更多信息，请参阅[了解 API、OIDC 和托管登录页面身份验证](authentication-flows-public-server-side.md#user-pools-API-operations)。

## 用户运行时的 MFA 逻辑详情
<a name="user-pool-settings-mfa-user-outcomes"></a>

为确定用户登录时要采取的步骤，您的用户池会评估用户 MFA 首选项、[用户属性](user-pool-settings-attributes.md)、[用户池 MFA 设置](#user-pool-configuring-mfa)、[威胁防护](cognito-user-pool-settings-adaptive-authentication.md)操作和[自助账户恢复](managing-users-passwords.md#user-pool-password-reset-and-recovery)设置。然后，它会让用户登录，提示他们选择 MFA 方法、设置 MFA 方法或进行 MFA 验证。要设置 MFA 方法，用户必须提供[电子邮件地址或电话号码](user-pool-settings-mfa-sms-email-message.md)或[注册 TOTP 身份验证器](user-pool-settings-mfa-totp.md#totp-mfa-set-up-api)。他们还可以设置 MFA 选项并提前[注册首选项](#user-pool-settings-mfa-preferences-configure)。下图列出了用户池配置对初始注册后立即登录尝试的详细影响。

此图所示的逻辑适用于基于 SDK 的应用程序和[托管登录](cognito-user-pools-managed-login.md)登录流程，但在托管登录中较不明显。当您排查 MFA 的问题时，应从用户遇到的结果出发，反向追溯到用户配置文件以及影响该结果的用户池配置。

![\[便于最终用户选择 MFA 方法的 Amazon Cognito 用户池决策过程示意图。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/cup-mfa-decision-tree.png)


以下清单对应于决策逻辑图中的编号，并详细描述了每个步骤。![\[checkmark\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png) 表示身份验证成功且流程已结束。![\[error\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/error.png) 表示身份验证失败。

1. 用户在登录界面输入其用户名，或用户名和密码。如果提供的凭证无效，其登录请求将被拒绝。

1. 如果用户成功通过用户名密码身份验证，则需判断 MFA 是必需、可选还是关闭。如果关闭，则使用正确的用户名和密码即可成功进行身份验证。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

   1. 如果 MFA 为可选，需判断用户之前是否已设置 TOTP 身份验证器。如果已设置 TOTP，则提示用户进行 TOTP MFA。如果用户成功响应该 MFA 质询，即可成功登录。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

   1. 判断威胁防护的自适应身份验证功能是否已要求该用户设置 MFA。如果未分配 MFA，则用户可成功登录。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

1. 如果 MFA 为必需，或自适应身份验证已为用户分配 MFA，则需判断该用户是否已启用并设定首选的 MFA 因素。如果有，则使用该因素提示用户进行 MFA 验证。如果用户成功响应该 MFA 质询，即可成功登录。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

1. 如果用户尚未设置 MFA 首选项，则需判断该用户是否已注册 TOTP 身份验证器。

   1. 如果用户已注册 TOTP 身份验证器，则需判断该用户池中是否启用了 TOTP MFA（即使用户之前已设置身份验证器，此后 TOTP MFA 仍可能被禁用）。

   1. 判断用户池中电子邮件消息或短信形式的 MFA 是否也可用。

   1.  如果电子邮件和短信 MFA 均不可用，则提示用户进行 TOTP MFA 验证。如果用户成功响应该 MFA 质询，即可成功登录。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

   1. 如果电子邮件或短信 MFA 可用，则需判断用户是否具有相应的 `email` 或 `phone_number` 属性。如果已设置，则任何未被用作自助账户恢复的主要方式且已启用用于 MFA 的属性，均可供用户使用。

   1. 向用户发起一个 `SELECT_MFA_TYPE` 质询，其中 `MFAS_CAN_SELECT` 选项包含 TOTP 以及可用的短信或电子邮件 MFA 因素。

   1.  根据用户在 `SELECT_MFA_TYPE` 质询中选择的因素，提示用户完成该因素的验证。如果用户成功响应该 MFA 质询，即可成功登录。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

1. 如果用户尚未注册 TOTP 身份验证器，或者已注册但 TOTP MFA 当前已禁用，则需判断该用户是否设置了 `email` 或 `phone_number` 属性。

1.  如果用户仅有一个电子邮件地址或仅有一个电话号码，则需判断该属性是否同时也是用户池用于发送密码重置账户恢复消息的方式。如果是，则在 MFA 为必需的情况下，用户无法完成登录，Amazon Cognito 将返回错误。要使该用户成功登录，必须为其添加一个非恢复用途的属性，或为其注册一个 TOTP 身份验证器。![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/error.png)

   1. 如果用户拥有可用的、非恢复用途的电子邮件地址或电话号码，则需判断对应的电子邮件或短信 MFA 因素是否已启用。

   1. 如果用户拥有非恢复用途的电子邮件地址属性，且电子邮件 MFA 已启用，则可向其发起 `EMAIL_OTP` 质询。如果用户成功响应该 MFA 质询，即可成功登录。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

   1. 如果用户拥有非恢复用途的电话号码属性，且短信 MFA 已启用，则可向其发起 `SMS_MFA` 质询。如果用户成功响应该 MFA 质询，即可成功登录。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

   1. 如果用户没有可用于已启用电子邮件或短信 MFA 因素的属性，则需判断 TOTP MFA 是否已启用。如果 TOTP MFA 已禁用，则在 MFA 为必需的情况下，用户无法完成登录，Amazon Cognito 将返回错误。要使该用户成功登录，必须为其添加一个非恢复用途的属性，或为其注册一个 TOTP 身份验证器。![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/error.png)
**注意**  
如果用户已注册 TOTP 身份验证器但 TOTP MFA 已禁用，则此步骤此前已被判定为**否**。

   1. 如果 TOTP MFA 已启用，则向用户发起一个 `MFA_SETUP` 质询，并在 `MFAS_CAN_SETUP` 选项中包含 `SOFTWARE_TOKEN_MFA`。要完成此质询，您必须单独为用户注册一个 TOTP 身份验证器，然后使用 `"ChallengeName": "MFA_SETUP", "ChallengeResponses": {"USERNAME": "[username]", "SESSION": "[Session ID from VerifySoftwareToken]}"` 进行回应。

   1. 用户使用[VerifySoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifySoftwareToken.html)请求中的会话令牌回应`MFA_SETUP`质询后，提示他们提出`SOFTWARE_TOKEN_MFA`质疑。如果用户成功响应该 MFA 质询，即可成功登录。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

1. 如果用户同时拥有电子邮件地址和电话号码，则需判断其中哪一个属性（如果有的话）是密码重置账户恢复消息的主要发送方式。

   1. 如果自助账户恢复功能已禁用，则这两个属性均可用于 MFA。需判断电子邮件 MFA、短信 MFA 或两者是否已启用。

   1. 如果这两个属性均已启用为 MFA 因素，则向用户发起一个 `SELECT_MFA_TYPE` 质询，其中 `MFAS_CAN_SELECT` 选项为 `SMS_MFA` 和 `EMAIL_OTP`。

   1. 根据用户在 `SELECT_MFA_TYPE` 质询中选择的因素，提示他们完成该因素的验证。如果用户成功响应该 MFA 质询，即可成功登录。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

   1. 如果仅有一个属性符合 MFA 因素的条件，则向用户发起对应另一个因素的质询。如果用户成功响应该 MFA 质询，即可成功登录。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

      如果存在以下情形，可能会发生这种结果。

      1. 当用户同时拥有 `email` 和 `phone_number` 属性，短信和电子邮件 MFA 均已启用，且账户恢复的主要方式已设定为通过电子邮件或短信时。

      1. 当用户同时拥有 `email` 和 `phone_number` 属性，仅短信 MFA 或电子邮件 MFA 之一已启用，且自助账户恢复已禁用时。

1. 如果用户尚未注册 TOTP 身份验证器，且既无 `email` 也无 `phone_number` 属性，则向其发起一个 `MFA_SETUP` 质询。`MFAS_CAN_SETUP` 列表中包含用户池中所有已启用且不是账户恢复主要选项的 MFA 因素。用户可通过 `ChallengeResponses` 响应此质询，以设置电子邮件或 TOTP MFA。要设置短信 MFA，必须先单独为用户添加电话号码属性，然后重新开始身份验证流程。

   对于 TOTP MFA，使用 `"ChallengeName": "MFA_SETUP", "ChallengeResponses": {"USERNAME": "[username]", "SESSION": "[Session ID from VerifySoftwareToken]"}` 进行响应。

   对于电子邮件 MFA，使用 `"ChallengeName": "MFA_SETUP", "ChallengeResponses": {"USERNAME": "[username]", "email": "[user's email address]"}` 进行响应。

   1. 根据用户在 `SELECT_MFA_TYPE` 质询中选择的因素，提示他们完成该因素的验证。如果用户成功响应该 MFA 质询，即可成功登录。![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/checkmark.png)

## 为用户池配置多重身份验证
<a name="user-pool-configuring-mfa"></a>

您可以在 Amazon Cognito 控制台中配置 MFA，也可以使用 API 操作和 SD [SetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserPoolMfaConfig.html)K 方法进行配置。

**在 Amazon Cognito 控制台中配置 MFA**

1. 登录 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)。

1. 选择**用户池**。

1. 从列表中选择一个现有用户池，或[创建一个用户池](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 选择**登录**菜单。找到**多重身份验证**，然后选择**编辑**。

1. 选择您希望用于用户池的**MFA 强制执行**方法。  
![\[一张来自 Amazon Cognito 控制台的屏幕截图，显示了 MFA 选项。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/cup-mfa.png)

   1. **需要 MFA**。用户池中的所有用户必须使用额外的短信验证码、电子邮件验证码或基于时间的一次性密码（TOTP）验证码作为额外的身份验证因素进行登录。

   1. **可选 MFA**。您可以为用户提供选项来注册额外的登录安全因素，但仍允许未配置 MFA 的用户登录。如果您使用自适应身份验证，请选择此选项。有关自适应身份验证的更多信息，请参阅[具备威胁防护的高级安全功能](cognito-user-pool-settings-threat-protection.md)。

   1. **无 MFA**。您的用户无法注册其他登录安全要素。

1. 选择您在应用程序中支持的 **MFA 方法**。您可以将**电子邮件消息**、**短信**或 TOTP 生成的**身份验证器应用程序**设置为第二个因素。

1. 如果使用 SMS 文本消息作为第二安全要素，并且没有配置 IAM 角色与 Amazon Simple Notification Service（Amazon SNS）一起使用 SMS 消息，您可以在控制台中创建一个角色。在用户池的**身份验证方法**菜单中，找到**短信**，然后选择**编辑**。您还可以使用允许 Amazon Cognito 代表您向用户发送短信的现有角色。有关更多信息，请参阅 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

   如果使用电子邮件消息作为第二安全因素，但尚未为 Amazon Simple Email Service (Amazon SES) 配置源身份以发送电子邮件消息，则可以在控制台中创建一个。必须选择**使用 SES 发送电子邮件**选项。在用户池的**身份验证方法**菜单中，找到**电子邮件**，然后选择**编辑**。从列表中可用的已验证身份中，选择一个**发件人电子邮件地址**。如果您选择了一个已验证的域（例如 `example.com`），则还必须在该已验证域下配置一个**发件人姓名**，例如 `admin-noreply@example.com`。

1. 选择**保存更改**。