

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

# 密码、账户恢复和密码策略
<a name="managing-users-passwords"></a>

所有登录到用户池的用户（甚至是[联合用户](cognito-terms.md#terms-federateduser)）都为其用户配置文件分配了密码。[本地用户](cognito-terms.md#terms-localuser)和[关联用户](cognito-terms.md#terms-linkeduser)在登录时必须提供密码。联合用户不使用用户池密码，而是使用其身份提供者（IdP）登录。您可以允许用户自行重置密码、以管理员身份重置或更改密码，以及[设置密码复杂度和历史策略](#user-pool-settings-policies)。

Amazon Cognito 不以明文形式存储用户密码。而是通过用户特定的加密盐来存储每个用户密码的哈希值。因此，您无法从用户池中的用户配置文件检索现有密码。作为一项最佳实践，请不要在任何地方存储明文用户密码。当用户忘记密码时，执行密码重置。

## 密码重置和恢复
<a name="user-pool-password-reset-and-recovery"></a>

用户忘记了自己的密码。您可能希望他们能够自己重置密码，或者您可能希望由管理员为他们重置密码。Amazon Cognito 用户池有这两种模式的选项。指南的这一部分介绍用户池设置和用于密码重置的 API 操作。

[ForgotPassword](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html)API 操作和托管登录选项**忘记密码了吗？** 向用户发送验证码，当他们确认自己拥有正确的密码时，他们便有机会设置新密码[ConfirmForgotPassword](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html)。这是自助式密码恢复模式。

**恢复未经验证的用户**  
您可以向已验证其电子邮件地址或电话号码的用户发送恢复消息。如果他们没有已确认的恢复电子邮件或电话，用户池管理员可以将其电子邮件地址或电话号码标记为已验证。在 Amazon Cognito 控制台中编辑用户的**用户属性**，然后选中**将电话号码标记为已验证**或**将电子邮件地址标记为已验证**旁边的复选框。您也可以在[AdminUpdateUserAttributes](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html)请求中将`email_verified`或设置`phone_number_verified`为 true。对于新用户，[ResendConfirmationCode](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_ResendConfirmationCode.html)API 操作会向他们的电子邮件地址或电话号码发送新的验证码，他们就可以完成自助确认和验证。

**以管理员身份重置密码**  
[AdminSetUserPassword](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html)和 [AdminResetUserPassword](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html)API 操作是管理员启动的密码重置方法。 `AdminSetUserPassword`设置临时或永久密码，并以与相同的方式`AdminResetUserPassword`向用户发送密码重置代码。`ForgotPassword`

### 配置密码重置和恢复
<a name="user-pool-password-reset-and-recovery-configure"></a>

Amazon Cognito 会根据您在控制台中创建用户池时选择的必需属性和登录选项自动选择您的账户恢复选项。您可以修改这些默认设置。

用户首选 MFA 方法会影响他们可用于恢复密码的方法。首选 MFA 方式为电子邮件的用户无法通过电子邮件接收密码重置代码。首选 MFA 方式为短信的用户无法通过短信接收密码重置代码。

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

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

**注意**  
用户无法在同一电子邮件地址或电话号码上接收 MFA 验证码和密码重置验证码。如果他们使用电子邮件中的一次性密码 (OTPs) 进行 MFA，则必须使用 SMS 消息进行账户恢复。如果他们使用 OTPs 来自短信的 MFA，则必须使用电子邮件进行账户恢复。在具有 MFA 的用户池中，如果用户有电子邮件地址的属性但没有电话号码，或者有电话号码但没有电子邮件地址，则他们可能无法完成自助密码恢复。  
要防止用户无法在使用此配置的用户池中重置密码的情况，请设置 `email` 和 `phone_number` [属性（按需设置）](user-pool-settings-attributes.md)。或者，您可以设置相关流程，在用户注册时或管理员创建用户配置文件时，始终收集并设置这些属性。当用户同时具备这两个属性时，Amazon Cognito 会自动将密码重置验证码发送到*不是*用户 MFA 因素的目的地。

以下过程在用户池中配置自助账户恢复。

------
#### [ Configure self-service password reset (API/SDK) ]

该`AccountRecoverySetting`参数是用户池参数，用于设置用户在 [ForgotPassword](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html)API 请求中或选择 “**忘记密码？” 时可以用来恢复密码**的方法。 在托管登录中。 `ForgotPassword`向经过验证的电子邮件或经过验证的电话号码发送恢复码。恢复代码的有效期为 1 小时。当您为用户池指定 [AccountRecoverySetting](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_AccountRecoverySettingType.html) 时，Amazon Cognito 会根据您设置的优先级选择代码发送目标。

当您定义 `AccountRecoverySetting` 并且用户配置了 SMS MFA 时，不能将 SMS 用作账户恢复机制。此设置的优先级已确定，其中 `1` 为最高优先级。Amazon Cognito 仅向指定方法之一发送验证。以下示例 `AccountRecoverySetting` 将电子邮件地址设置为账户恢复代码的主要目标，如果用户没有电子邮件地址属性，则回退到短信。

```
"AccountRecoverySetting": { 
   "RecoveryMechanisms": [ 
      { 
         "Name": "verified_email",
         "Priority": 1
      },
      { 
         "Name": "verified_phone_number",
         "Priority": 2
      }
   ]
}
```

值 `admin_only` 会关闭自助账户恢复，而是要求用户联系他们的管理员进行密码重置。您不能将 `admin_only` 与任何其他账户恢复机制一起使用。以下

```
"AccountRecoverySetting": { 
   "RecoveryMechanisms": [ 
      { 
         "Name": "admin_only",
         "Priority": 1
      }
   ]
}
```

如果未指定 `AccountRecoverySetting`，Amazon Cognito 会先将恢复码发送到经过验证的电话号码，如果用户没有电话号码属性，则会发送到经过验证的电子邮件地址。

有关 `AccountRecoverySetting` 的更多信息，请参阅 [UpdateUserPool](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html)和 [CreateUserPool](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html)。

------
#### [ Configure self-service password reset (console) ]

从用户池的**登录**菜单配置账户恢复和密码重置选项。

**设置用户账户恢复**

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

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

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

1. 选择**登录**菜单。找到**用户账户恢复**，然后选择**编辑**。

1. 要允许用户重置自己的密码，请选择**启用自助账户恢复**。

1. 为用户池发送给用户的密码恢复代码配置发送方式。在**用户账户恢复消息的发送方法**下，选择一个可用选项。最佳做法是，选择具有辅助消息发送方法的选项，例如**如果电子邮件可用，则使用电子邮件发送，否则使用短信**。借助辅助发送方法，Amazon Cognito 在向用户发送代码时，可以要求用户使用与 MFA 不同的媒介来重置密码。

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

------

### 忘记密码行为
<a name="forgot-password"></a>

在给定时间内，作为忘记密码和操作的一部分，我们允许用户尝试请求或输入密码重置码 5 到 20 次。 confirm-forgot-password确切的值取决于与请求关联的风险参数。请注意，这种行为可能会发生变化。

## 添加用户池密码要求
<a name="user-pool-settings-policies"></a>

作为用户池的最佳安全实践，应该设置强大、复杂的密码。特别是在对互联网开放的应用程序中，弱密码会将用户的凭证暴露给会猜测密码并尝试访问您的数据的系统。密码越复杂，就越难猜出。Amazon Cognito 为注重安全的管理员提供了其他工具 ACLs，例如[威胁防护](cognito-user-pool-settings-threat-protection.md#cognito-user-pool-settings-threat-protection.title)和[Amazon WAF 网络](user-pool-waf.md#user-pool-waf.title)，但是您的密码策略是用户目录安全的核心要素。

Amazon Cognito 用户池中本地用户的密码不会自动过期。妥善的做法是在外部系统中记录用户密码重置的时间、日期和元数据。通过记录密码使用期限的外部日志，您的应用程序或 Lambda 触发器可以查找用户的密码使用期限，并在给定时间后要求重置。

您可以将用户池配置为要求密码具有最低复杂性，以符合您的安全标准。复杂密码的最小长度为至少八个字符。还必须包括大写字母、数字和特殊字符的组合。

通过基础版或增值版功能计划，您还可以设置密码重用策略。您可以阻止用户将其新密码重置为与其当前密码相同，也不得与最多 23 个以前的其他密码中的任何一个相同，即用户不能将新密码设置为这 24 个密码中的任何一个。

**设置用户池密码策略**

1. 创建一个用户池并导航到**配置安全要求**步骤，或访问现有用户池并导航到**身份验证方法**菜单。

1. 导航到**密码策略**。

1. 选择**密码策略模式**。**Cognito 默认**使用推荐的最低设置来配置您的用户池。您也可以选择一项**自定义**密码策略。

1. 设置**密码最小长度**。所有用户都必须使用长度大于或等于这个值的密码进行注册或创建。您可以将这个最小值设置为 99，但用户可以设置最长 256 个字符的密码。

1. 在**密码要求**下配置密码的复杂性规则。选择您希望在每个用户的密码中至少包含一个的字符类型（数字、特殊字符、大写字母和小写字母）。

   可以要求密码中至少包含以下字符之一：在 Amazon Cognito 确认密码中包含所需的最少字符后，用户的密码可以包含任何类型的额外字符，但不得超过最大密码长度。
   + 大写和小写[基本拉丁](https://en.wikipedia.org/wiki/ISO_basic_Latin_alphabet)字母
   + 数字
   + 以下特殊字符。

     ```
     ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~ ` = + - 
     ```
   + 非前导、非结尾的空格字符。

1. 为**管理员设置的临时密码到期时间**设置一个值。超过此期限，您通过 Amazon Cognito 控制台或 `AdminCreateUser` 创建的新用户将无法登录和设置新密码。使用临时密码登录后，他们的用户账户永远不会过期。要在 Amazon Cognito 用户池 API 中更新密码时长，请在您的[CreateUserPool](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html)或 [UpdateUserPool](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html)API 请求[TemporaryPasswordValidityDays ](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_PasswordPolicyType.html#CognitoUserPools-Type-PasswordPolicyType-TemporaryPasswordValidityDays)中为设置一个值。

1. 为**防止使用之前的密码**设置一个值（如果有）。要使用此功能，请在用户池中选择基础版或增值版[功能计划](cognito-sign-in-feature-plans.md)。此参数的值是在用户重置密码时阻止新密码匹配的先前密码数。

要重置已过期用户账户的访问权限，请执行以下操作之一：
+ 发送新的临时密码并使用已`MessageAction`设置为的 [AdminCreateUser](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html)API 请求重置过期时间`RESEND`。
+ 删除用户配置文件并创建新的用户配置文件。
+ 在 [AdminResetUserPassword](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html)API 请求中生成新的确认码。