

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 密碼、帳戶復原和密碼政策
<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 不會以純文字儲存使用者密碼。反之，它會使用使用者特定的 salt 來存放每個使用者密碼的雜湊。因此，您無法從使用者集區中的使用者設定檔擷取現有的密碼。根據最佳實務，請勿將純文字使用者密碼存放在任何地方。當使用者忘記密碼時，執行密碼重設。

## 密碼重設和復原
<a name="user-pool-password-reset-and-recovery"></a>

使用者忘記密碼。您可能希望他們能夠自行重設密碼，或者您可能想要要求管理員為其重設密碼。Amazon Cognito 使用者集區具有兩種模型的選項。本指南的此部分涵蓋使用者集區設定和用於密碼重設的 API 操作。

[ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) API 操作和受管登入選項 **忘記您的密碼？** 會傳送程式碼給使用者，當他們確認擁有正確的程式碼時，讓他們有機會使用 [ConfirmForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html) 設定新密碼。這是自助式密碼復原模型。

**復原未驗證的使用者**  
您可以傳送復原訊息給已驗證其電子郵件地址或電話號碼的使用者。如果他們沒有已確認的復原電子郵件或電話，使用者集區管理員可以將其電子郵件地址或電話號碼標記為已驗證。在 Amazon Cognito 主控台中編輯使用者**屬性**，然後選取**將電話號碼標記為已驗證**或**將電子郵件地址標記為已驗證**旁的核取方塊。您也可以在 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) 請求中將 `email_verified`或 `phone_number_verified` 設為 true。對於新使用者，[ResendConfirmationCode](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ResendConfirmationCode.html) API 操作會將新代碼傳送到其電子郵件地址或電話號碼，他們可以完成自助式確認和驗證。

**以管理員身分重設密碼**  
[AdminSetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html) 和 [AdminResetUserPassword](https://docs.aws.amazon.com/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 是 SMS 訊息的使用者無法透過 SMS 接收密碼重設碼。

當使用者不符合您偏好的密碼重設方法時，[您的密碼復原](#user-pool-password-reset-and-recovery)設定必須提供替代選項。例如，您的復原機制可能以電子郵件為第一優先，而電子郵件 MFA 可能是使用者集區中的選項。在此情況下，請新增簡訊帳戶復原做為第二個選項，或使用管理 API 操作來重設這些使用者的密碼。

Amazon Cognito 會回應來自沒有有效復原方法且錯誤`InvalidParameterException`回應的使用者的密碼重設請求。

**注意**  
使用者無法在相同的電子郵件地址或電話號碼接收 MFA 和密碼重設代碼。如果他們使用來自 MFA 電子郵件訊息的一次性密碼 (OTPs)，則必須使用 SMS 訊息進行帳戶復原。如果他們使用來自 MFA 簡訊的 OTPs，則必須使用電子郵件訊息進行帳戶復原。在具有 MFA 的使用者集區中，如果使用者有電子郵件地址的屬性，但沒有電話號碼，或是電話號碼，但沒有電子郵件地址，則可能無法完成自助式密碼復原。  
若要防止使用者無法使用此組態在使用者集區中重設密碼的狀態，請視需要設定 `email`和 `phone_number` 屬性。 [使用使用者屬性](user-pool-settings-attributes.md)或者，您可以設定程序，在使用者註冊或管理員建立使用者設定檔時，一律收集和設定這些屬性。當使用者有兩個屬性時，Amazon Cognito 會自動將密碼重設代碼傳送至*不是*使用者 MFA 因素的目的地。

下列程序會在使用者集區中設定自助式帳戶復原。

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

`AccountRecoverySetting` 參數是使用者集區參數，可設定使用者在 [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) API 請求中或在受管登入中選取**忘記密碼？**時可用來復原密碼的方法。 `ForgotPassword`會將復原碼傳送至已驗證的電子郵件或已驗證的電話號碼。此復原代碼的有效期限為一小時。當您為使用者集區指定 [AccountRecoverySetting](https://docs.aws.amazon.com/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`。下列 e

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

如果您未指定 `AccountRecoverySetting`，Amazon Cognito 會先將復原碼傳送至已驗證的電話號碼，如果使用者沒有電話號碼屬性，則會傳送至已驗證的電子郵件地址。

如需 的詳細資訊`AccountRecoverySetting`，請參閱 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 和 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html)。

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

從使用者集區的**登入**功能表設定帳戶復原和密碼重設選項。

**設定使用者帳戶復原**

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

1. 選擇 **User Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區，或[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 選擇**登入**選單。尋找**使用者帳戶復原**，然後選擇**編輯**

1. 若要允許使用者重設自己的密碼，請選擇**啟用自助式帳戶復原**。

1. 針對使用者集區傳送給使用者的密碼復原碼，設定交付方法。在**使用者帳戶復原訊息的交付方法**下，選取可用的選項。最佳實務是選擇具有次要傳送訊息方法的選項，例如**電子郵件，如果可用，否則為簡訊**。透過次要交付方法，Amazon Cognito 可以要求使用者使用不同的媒體進行密碼重設，而非 MFA。

1. 選取**儲存變更**。

------

### 忘記密碼行為
<a name="forgot-password"></a>

在指定時段內，我們允許使用者可嘗試 5 到 20 次來要求或輸入密碼重設代碼，這是忘記密碼和確認忘記密碼時可操作的步驟。確切的值取決於與要求相關的風險參數。請注意，此行為可能會有所變更。

## 新增使用者集區密碼要求
<a name="user-pool-settings-policies"></a>

強式、複雜的密碼是使用者集區的安全最佳實務。特別是在開放給網際網路的應用程式，較弱的密碼可能會將使用者的登入資料公開給猜測密碼並嘗試存取資料的系統。密碼越複雜，猜測的難度就越高。Amazon Cognito 為具有安全意識的管理員提供額外的工具，例如[威脅防護](cognito-user-pool-settings-threat-protection.md#cognito-user-pool-settings-threat-protection.title)和 [AWS WAF Web ACLs](user-pool-waf.md#user-pool-waf.title)，但您的密碼政策是使用者目錄安全的核心元素。

Amazon Cognito 使用者集區中本機使用者的密碼不會自動過期。最佳實務是在外部系統中記錄使用者密碼重設的時間、日期和中繼資料。透過密碼存留期的外部日誌，您的應用程式或 Lambda 觸發程序可以查詢使用者的密碼存留期，並在指定期間後要求重設。

您可以設定使用者集區，要求符合安全標準的最低密碼複雜性。複雜密碼的長度下限至少為八個字元。它們還包括大寫、數字和特殊字元的組合。

透過 Essentials 或 Plus 功能層，您也可以設定密碼重複使用的政策。您可以防止使用者將其密碼重設為符合其目前密碼或最多 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.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 或 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) API 請求中設定 [TemporaryPasswordValidityDays](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_PasswordPolicyType.html#CognitoUserPools-Type-PasswordPolicyType-TemporaryPasswordValidityDays) 的值。

1. 如果可用，請設定**防止使用先前密碼**的值。若要使用此功能，請在使用者集區中選擇 Essentials 或 Plus [功能層](cognito-sign-in-feature-plans.md)。此參數的值是當使用者重設密碼時，防止新密碼相符的先前密碼數目。

若要重設過期使用者帳戶的存取權，請執行下列其中一項操作：
+ 傳送新的臨時密碼，並使用已`MessageAction`設定為 的 [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html) API 請求重設過期期間`RESEND`。
+ 刪除使用者描述檔並建立新的描述檔。
+ 在 [AdminResetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html) API 請求中產生新的確認碼。