

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

# 使用 Amazon Cognito 使用者集區安全性功能
<a name="managing-security"></a>

您可能想要保護您的應用程式免於網路入侵、密碼猜測、使用者模擬，以及惡意註冊和登入。Amazon Cognito 使用者集區安全功能的組態可以是安全架構中的關鍵元件。應用程式的安全是*客戶的責任「雲端安全」*，如 AWS [共同的責任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)中所述。本章中的工具有助於您的應用程式安全設計符合這些目標。

設定使用者集區時必須做出的重要決策是是否允許公開註冊和登入。有些使用者集區選項，例如機密用戶端、使用者的管理建立和確認，以及沒有網域的使用者集區，都會受到較小程度的網際網路攻擊。不過，常見的使用案例是接受網際網路上任何人註冊的公有用戶端，並將所有操作直接傳送到您的使用者集區。在任何組態中，尤其是在這些公有組態的情況下，我們建議您以安全功能來規劃和部署使用者集區。當不需要的來源建立新的作用中使用者或嘗試利用現有使用者時，安全性不足也可能會影響您的 AWS 帳單。

MFA 和威脅防護適用於[本機使用者](cognito-terms.md#terms-localuser)。第三方 IdPs 負責[聯合身分使用者](cognito-terms.md#terms-federateduser)的安全狀態。使用者集區安全功能

**多重要素驗證 (MFA)**  
請求使用者集區透過電子郵件 （使用 Essentials 或 Plus 功能計劃） 或簡訊，或從驗證器應用程式傳送的代碼，以確認使用者集區登入。

**威脅防護**  
監控登入是否有風險指標，並套用 MFA 或區塊登入。新增自訂宣告和範圍以存取字符。透過電子郵件傳送 MFA 代碼。

**AWS WAF Web ACLs**  
檢查使用者[集區端點和身分驗證 API](authentication-flows-public-server-side.md#user-pools-API-operations) 的傳入流量，是否有網路和應用程式層上不必要的活動。

**區分大小寫**  
防止建立電子郵件地址或慣用使用者名稱與其他使用者相同的使用者，但字元案例除外。

**刪除保護**  
防止自動化系統意外刪除您的使用者集區。需要額外確認 中的使用者集區刪除 AWS 管理主控台。

**使用者存在錯誤**  
防止在使用者集區中公開現有的使用者名稱和別名。傳回一般錯誤以回應身分驗證失敗，無論使用者名稱是否有效。

**Topics**
+ [將 MFA 新增到使用者集區](user-pool-settings-mfa.md)
+ [具有威脅防護的進階安全性](cognito-user-pool-settings-threat-protection.md)
+ [將 AWS WAF Web ACL 與使用者集區建立關聯](user-pool-waf.md)
+ [使用者集區大小寫區分](user-pool-case-sensitivity.md)
+ [使用者集區刪除保護](user-pool-settings-deletion-protection.md)
+ [管理使用者存在錯誤回應](cognito-user-pool-managing-errors.md)

# 將 MFA 新增到使用者集區
<a name="user-pool-settings-mfa"></a>

MFA 會將*您具有*身分驗證因素的項目新增至*您知道*的初始因素，通常是使用者名稱和密碼。您可以選擇簡訊、電子郵件訊息或以時間為基礎的一次性密碼 (TOTP) 作為其他因素，以登入具有密碼作為其主要身分驗證因素的使用者。

多重要素驗證 (MFA) 可提高應用程式中[本機使用者](cognito-terms.md#terms-localuser)的安全性。如果是[聯合身分使用者](cognito-terms.md#terms-federateduser)，Amazon Cognito 會將所有身分驗證程序委派給 IdP，而不會為他們提供其他身分驗證因素。

**注意**  
新使用者首次登入您的應用程式時，Amazon Cognito 會發出 OAuth 2.0 權杖，即使您的使用者集區需要 MFA 也是如此。您的使用者首次登入時的第二個身分驗證要素是確認 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)
+ [SMS 和電子郵件訊息 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 *或使用*無密碼因素登入，但有一個例外：當您在使用者集區 `MULTI_FACTOR_WITH_USER_VERIFICATION`中`FactorConfiguration`將 設定為 時，具有使用者驗證的通行金鑰可以滿足 MFA 要求`WebAuthnConfiguration`。
  + 您無法在支援[一次性密碼](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)的使用者集區中將 MFA 設定為必要。
  + 當使用者集區中需要 MFA `AllowedFirstAuthFactors`時，您無法將 `EMAIL_OTP`或 `SMS_OTP` 新增至 。您可以在 `FactorConfiguration` 設定為 `WEB_AUTHN`時新增 `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-srp)中的 [使用持久性密碼登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password)和 。
  + 在 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_tw/cognito/latest/developerguide/user-pool-settings-mfa.html)
+ 使用者偏好的 MFA 方法會影響他們可以用來復原密碼的方法。偏好的 MFA 為電子郵件訊息的使用者無法透過電子郵件接收密碼重設碼。偏好的 MFA 是 SMS 訊息的使用者無法透過 SMS 接收密碼重設碼。

  當使用者不符合您偏好的密碼重設方法時，[您的密碼復原](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 和密碼重設代碼。如果他們使用來自 MFA 電子郵件訊息的一次性密碼 (OTPs)，則必須使用 SMS 訊息進行帳戶復原。如果他們使用來自 MFA 簡訊的 OTPs，則必須使用電子郵件訊息進行帳戶復原。在具有 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) 中所述。
+ 如果您的帳戶位於 中的 SMS 沙盒中 AWS 區域 ，其中包含使用者集區的 Amazon Simple Notification Service (Amazon SNS) 資源，您必須先在 Amazon SNS 中驗證電話號碼，才能傳送簡訊。如需詳細資訊，請參閱[Amazon Cognito 使用者集區的簡訊設定](user-pool-sms-settings.md)。
+ 若要變更使用者的 MFA 狀態以回應具有威脅防護的偵測到事件，請在 Amazon Cognito 使用者集區主控台中啟用 MFA 並將其設定為選用。如需詳細資訊，請參閱[具有威脅防護的進階安全性](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. 使用者具有有效的 `phone_number``email`或 屬性，或已設定 TOTP 的驗證器應用程式。

1. 至少一個 MFA 因素處於作用中狀態。

1. 一個 MFA 因素設定為偏好。

### 防止使用相同的登入和 MFA 因素
<a name="user-pool-settings-mfa-preferences-same-factor"></a>

您可以設定您的使用者集區，讓一個登入因素成為部分或所有使用者唯一可用的登入和 MFA 選項。當您的主要登入使用案例是電子郵件或簡訊一次性密碼 (OTPs) 時，可能會發生此結果。在下列情況下，使用者的偏好 MFA 可能與其登入類型相同：
+ 使用者集區中需要 MFA。
+ 電子郵件和簡訊 OTP 可在使用者集區中使用登入*和* MFA 選項。
+ 使用者使用電子郵件或簡訊 OTP 登入。
+ 它們具有電子郵件地址屬性，但沒有電話號碼屬性，或電話號碼屬性，但沒有電子郵件地址屬性。

在此案例中，使用者可以使用電子郵件 OTP 登入，並使用電子郵件 OTP 完成 MFA。此選項會取消 MFA 的基本函數。使用一次性密碼登入的使用者必須能夠使用與 MFA 不同的傳遞方法進行登入。當使用者同時擁有簡訊和電子郵件選項時，Amazon Cognito 會自動指派不同的因素。例如，當使用者使用電子郵件 OTP 登入時，他們偏好的 MFA 是 SMS 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 參數是 `CreateUserPool`和 的 [AccountRecoverySetting](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-AccountRecoverySetting) 參數`UpdateUserPool`。

  例如，當復原選項為**僅限電子郵件時，使用者無法設定電子郵件** MFA。這是因為您無法啟用電子郵件 MFA，且只能在相同的使用者集區中將復原選項設定為**電子郵件**。當您將此選項設定為**電子郵件時，否則 SMS** 會是優先順序復原選項，但當使用者不符合電子郵件訊息復原的資格時，您的使用者集區可能會回到 SMS 訊息。在此案例中，使用者可以將電子郵件 MFA 設定為偏好，而且只有在他們嘗試重設密碼時才會收到簡訊。
+ 如果您只將一個 MFA 方法設為可用，則不需要管理使用者 MFA 偏好設定。
+ 作用中的 SMS 組態會自動讓 SMS 訊息成為使用者集區中可用的 MFA 方法。

  在使用者集區中包含您自己的 Amazon SES 資源的作用中[電子郵件組態](user-pool-email.md)，以及 Essentials 或 Plus 功能計劃，會自動讓電子郵件訊息成為使用者集區中可用的 MFA 方法。
+ 當您在使用者集區中將 MFA 設定為必要時，使用者無法啟用或停用任何 MFA 方法。您只能設定偏好的方法。
+ 當您在使用者集區中將 MFA 設定為選用時，受管登入不會提示使用者設定 MFA，但會在使用者擁有偏好的 MFA 方法時提示他們輸入 MFA 代碼。
+ 當您在全功能模式中啟用[威脅防護](cognito-user-pool-settings-threat-protection.md)並設定適應性驗證回應時，MFA 必須是使用者集區中的選用項目。具有適應性身分驗證的回應選項之一，是針對其登入嘗試評估為包含風險層級的使用者，要求 MFA。

  主控台**的註冊**功能表中**的必要屬性**設定會決定使用者是否必須提供電子郵件地址或電話號碼才能註冊您的應用程式。當使用者具有對應的屬性時，電子郵件和簡訊會變成合格的 MFA 因素。的[結構描述](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-Schema)參數會視需要`CreateUserPool`設定屬性。
+ 當您在使用者集區中將 MFA 設定為必要，且使用者使用受管登入登入登入時，Amazon Cognito 會提示他們從使用者集區的可用方法中選取 MFA 方法。受管登入會處理電子郵件地址或電話號碼的集合，以及 TOTP 的設定。下圖示範 Amazon Cognito 提供給使用者的選項背後的邏輯。

### 設定使用者的 MFA 偏好設定
<a name="user-pool-settings-mfa-preferences-configure"></a>

您可以在具有存取金鑰授權的自助式模型中，或在具有管理 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_tw/cognito/latest/developerguide/images/cup-mfa-decision-tree.png)


下列清單對應至決策邏輯圖中的編號，並詳細說明每個步驟。![\[checkmark\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/checkmark.png) 指出成功的身分驗證和流程的結論。![\[error\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/error.png) 表示身分驗證失敗。

1. 使用者會在您的登入畫面中顯示其使用者名稱或使用者名稱和密碼。如果他們沒有出示有效的登入資料，則會拒絕他們的登入請求。

1. 如果他們成功進行使用者名稱密碼身分驗證，請判斷 MFA 是必要、選用還是關閉。如果關閉，正確的使用者名稱和密碼會導致身分驗證成功。 ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_tw/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_tw/cognito/latest/developerguide/images/checkmark.png)

   1. 判斷威脅防護的適應性身分驗證功能是否需要使用者設定 MFA。如果尚未指派 MFA，則會登入使用者。 ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_tw/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_tw/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_tw/cognito/latest/developerguide/images/checkmark.png)

   1. 如果電子郵件或簡訊 MFA 可用，請判斷使用者是否有對應的 `phone_number` `email`或 屬性。如果是這樣，則任何不是自助式帳戶復原主要方法且已啟用 MFA 的屬性都可以供他們使用。

   1. 向使用者提示包含 TOTP 和可用簡訊或電子郵件 MFA 因素`MFAS_CAN_SELECT`的選項`SELECT_MFA_TYPE`的挑戰。

   1.  提示使用者輸入他們為回應`SELECT_MFA_TYPE`挑戰而選取的因素。如果他們成功回應 MFA 挑戰，則會登入。 ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/checkmark.png)

1. 如果使用者尚未註冊 TOTP 驗證器，或者他們目前有 但 TOTP MFA 已停用，請判斷使用者是否有 `email`或 `phone_number` 屬性。

1.  如果使用者只有電子郵件地址或電話號碼，請判斷該屬性是否也是使用者集區實作來傳送帳戶復原訊息以進行密碼重設的方法。如果為 true，則無法完成需要 MFA 的登入，Amazon Cognito 會傳回錯誤。若要啟用此使用者的登入，您必須新增非復原屬性或為其註冊 TOTP 驗證器。 ![\[alt text not found\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/error.png)

   1. 如果他們有可用的非復原電子郵件地址或電話號碼，請判斷是否已啟用對應的電子郵件或 SMS MFA 因素。

   1. 如果他們有未復原的電子郵件地址屬性，且已啟用電子郵件 MFA，請提示他們提出 `EMAIL_OTP` 挑戰。如果他們成功回應 MFA 挑戰，則會登入。 ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/checkmark.png)

   1. 如果他們有未復原的電話號碼屬性，且已啟用 SMS MFA，請提示他們提出 `SMS_MFA` 挑戰。如果他們成功回應 MFA 挑戰，則會登入。 ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/checkmark.png)

   1. 如果他們沒有符合已啟用電子郵件或 SMS MFA 因素資格的屬性，請判斷是否已啟用 TOTP MFA。如果停用 TOTP MFA，則無法完成需要 MFA 的登入，Amazon Cognito 會傳回錯誤。若要啟用此使用者的登入，您必須新增非復原屬性或為其註冊 TOTP 驗證器。 ![\[alt text not found\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/error.png)
**注意**  
如果使用者具有 TOTP 驗證器但停用 TOTP MFA，則此步驟已評估為**否**。

   1. 如果已啟用 TOTP MFA，請在 `MFAS_CAN_SETUP`選項`SOFTWARE_TOKEN_MFA`中使用 向使用者提出`MFA_SETUP`挑戰。若要完成此挑戰，您必須為使用者分別註冊 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_tw/cognito/latest/developerguide/images/checkmark.png)

1. 如果使用者同時有電子郵件地址和電話號碼，請判斷是否有任何屬性是密碼重設的帳戶復原訊息的主要方法。

   1. 如果停用自助式帳戶復原，任一屬性都可以用於 MFA。判斷是否已啟用電子郵件和簡訊 MFA 因素之一或兩者。

   1. 如果兩個屬性都啟用為 MFA 因素，請提示使用者使用`MFAS_CAN_SELECT`選項 `SMS_MFA`和 進行`SELECT_MFA_TYPE`挑戰`EMAIL_OTP`。

   1. 提示他們輸入為了回應`SELECT_MFA_TYPE`挑戰而選取的因素。如果他們成功回應 MFA 挑戰，則會登入。 ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/checkmark.png)

   1. 如果只有一個屬性是合格的 MFA 因素，請提示它們對剩餘的因素提出挑戰。如果他們成功回應 MFA 挑戰，則會登入。 ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/checkmark.png)

      此結果會在下列案例中發生。

      1. 當它們具有 `email` 和 `phone_number` 屬性時，會啟用 SMS 和電子郵件 MFA，主要帳戶復原方法是透過電子郵件或簡訊。

      1. 當它們具有 `email`和 `phone_number` 屬性時，只會啟用 SMS MFA 或電子郵件 MFA，並停用自助式帳戶復原。

1. 如果使用者尚未註冊 TOTP 驗證器，且沒有 `email`或 `phone_number` 屬性，請提示他們提出 `MFA_SETUP` 挑戰。中的清單`MFAS_CAN_SETUP`包含使用者集區中非主要帳戶復原選項的所有已啟用 MFA 因素。他們可以使用 `ChallengeResponses` 來回應電子郵件或 TOTP MFA 的挑戰。若要設定 SMS 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_tw/cognito/latest/developerguide/images/checkmark.png)

## 設定使用者集區以進行多重驗證
<a name="user-pool-configuring-mfa"></a>

您可以在 Amazon Cognito 主控台或使用 [SetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserPoolMfaConfig.html) API 操作和 SDK 方法設定 MFA。

**在 Amazon Cognito 主控台中設定 MFA**

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. 選擇您想要與使用者集區搭配使用的 **MFA 強制執行**方法。  
![\[Amazon Cognito 主控台的螢幕擷取畫面，其中包含 MFA 選項。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/cup-mfa.png)

   1. **Require MFA** (需要 MFA)。您使用者集區中的所有使用者都必須使用額外的簡訊、電子郵件或以時間為基礎的一次性密碼 (TOTP) 程式碼登入，做為額外的身分驗證因素。

   1. **選用 MFA**。您可以提供使用者註冊其他登入因素的選項，但仍允許尚未設定 MFA 的使用者登入。如果您正在使用適應性身分驗證，請選擇此選項。如需有關適應性身分驗證的詳細資訊，請參閱 [具有威脅防護的進階安全性](cognito-user-pool-settings-threat-protection.md)。

   1. **No MFA** (沒有 MFA)。您的使用者無法註冊額外的登入要素。

1. 選擇您應用程式中支援的 **MFA methods** (MFA 方法)。您可以將**電子郵件訊息**、**簡訊**或產生 TOTP 的 **Authenticator 應用程式**設定為第二個因素。

1. 如果使用文字簡訊作為第二個要素，且您尚未設定與 Amazon Simple Notification Service (Amazon SNS) 搭配用於簡訊的 IAM 角色，則您可以在主控台中建立一個角色。在使用者集區的**身分驗證方法**選單中，尋找 **SMS** 並選擇**編輯**。您也可以使用允許 Amazon Cognito 為您將簡訊傳送給使用者的現有角色。如需詳細資訊，請參閱 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

   如果您使用電子郵件訊息做為第二個因素，且您尚未將原始身分設定為搭配 Amazon Simple Email Service (Amazon SES) 用於電子郵件訊息，請在 主控台中建立一個。您必須選擇**使用 SES 傳送電子郵件**選項。在使用者集區的**身分驗證方法**功能表中，找到**電子郵件**，然後選擇**編輯**。從清單中可用的已驗證身分中選取 **FROM 電子郵件地址**。如果您選擇已驗證的網域，例如 `example.com`，您還必須在已驗證的網域中設定 **FROM 寄件者名稱**，例如 `admin-noreply@example.com`。

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

# SMS 和電子郵件訊息 MFA
<a name="user-pool-settings-mfa-sms-email-message"></a>

SMS 和電子郵件 MFA 訊息確認使用者可以存取訊息目的地，然後才能登入。他們確認他們不僅可以存取密碼，還可以存取原始使用者的簡訊或電子郵件收件匣。Amazon Cognito 請求使用者提供短碼，您的使用者集區會在他們成功提供使用者名稱和密碼後傳送。

在使用者將電子郵件地址或電話號碼新增至其設定檔之後，簡訊和電子郵件訊息 MFA 不需要額外的組態。Amazon Cognito 可以將訊息傳送到未經驗證的電子郵件地址和電話號碼。當使用者完成第一個 MFA 時，Amazon Cognito 會將他們的電子郵件地址或電話號碼標記為已驗證。

當具有 MFA 的使用者在應用程式中輸入使用者名稱和密碼時，MFA 身分驗證就會開始。您的應用程式會在叫用 [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 請求的 SDK 方法中提交這些初始參數。API 回應`ChallengeParameters`中的 包含`CODE_DELIVERY_DESTINATION`一個值，指出授權碼的傳送位置。在您的應用程式中，顯示會提示使用者檢查其電話的表單，並包含程式碼的輸入元素。當他們輸入程式碼時，請在挑戰回應 API 請求中提交，以完成登入程序。

使用 MFA 的使用者在[受管登入](cognito-user-pools-managed-login.md)頁面中使用使用者名稱和密碼登入後，系統會自動提示他們輸入 MFA 代碼。

使用者集區會使用 中的 Amazon Simple Notification Service (Amazon SNS) 資源傳送 MFA 和其他 Amazon Cognito 通知的 SMS 訊息 AWS 帳戶。 Amazon SNS 同樣地，使用者集區會使用您帳戶中的 Amazon Simple Email Service (Amazon SES) 資源傳送電子郵件訊息。這些連結的服務會在您的訊息交付 AWS 帳單上產生自己的成本。他們也有在生產磁碟區傳送訊息的其他要求。如需詳細資訊，請參閱下列連結：
+ [Amazon Cognito 使用者集區的簡訊設定](user-pool-sms-settings.md)
+ [全球簡訊定價](https://aws.amazon.com/sns/sms-pricing/)
+ [Amazon Cognito 使用者集區的電子郵件設定](user-pool-email.md)
+ [Amazon SES 定價](https://aws.amazon.com/ses/pricing)

## SMS 和電子郵件訊息 MFA 的考量
<a name="user-pool-settings-mfa-sms-email-message-considerations"></a>
+ 若要允許使用者使用電子郵件 MFA 登入，您的使用者集區必須具有下列組態選項：

  1. 您的使用者集區中有 Plus 或 Essentials 功能計劃。如需詳細資訊，請參閱[使用者集區功能計劃](cognito-sign-in-feature-plans.md)。

  1. 您的使用者集區會使用您自己的 Amazon SES 資源傳送電子郵件訊息。如需詳細資訊，請參閱[Amazon SES 電子郵件組態](user-pool-email.md#user-pool-email-developer)。
+ MFA 代碼適用於您為應用程式用戶端設定的**身分驗證流程工作階段持續時間**。

  當您**編輯**應用程式用戶端時，請在**應用程式用戶端**選單的 Amazon Cognito 主控台中設定身分驗證流程工作階段的持續時間。您也可以在 `CreateUserPoolClient` 或 `UpdateUserPoolClient` API 請求中設定驗證流程工作階段持續時間。如需詳細資訊，請參閱[範例身分驗證工作階段](authentication.md#amazon-cognito-user-pools-authentication-flow)。
+ 當使用者成功從 Amazon Cognito 傳送到未驗證電話號碼或電子郵件地址的簡訊或電子郵件訊息中提供代碼時，Amazon Cognito 會將對應的屬性標記為已驗證。
+ 若要讓使用者對與 MFA 相關聯的電話號碼或電子郵件地址值進行自助式變更，他們必須使用存取字符登入並授權請求。如果他們無法存取目前的電話號碼或電子郵件地址，則無法登入。您的團隊必須使用 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) API 請求中的管理員 AWS 登入資料來變更這些值。
+ 在使用者集區中[設定 SMS](user-pool-sms-settings.md) 之後，您無法停用 SMS 訊息做為可用的 MFA 因素。

# TOTP 軟體權杖 MFA
<a name="user-pool-settings-mfa-totp"></a>

當您在使用者集區中設定 TOTP 軟體字符 MFA 時，使用者以使用者名稱和密碼登入，然後使用 TOTP 完成身分驗證。在您的使用者設定並驗證使用者名稱和密碼之後，他們就可以為 MFA 啟用 TOTP 軟體權杖。如果您的應用程式使用 Amazon Cognito 受管登入來登入使用者，您的使用者會提交其使用者名稱和密碼，然後在其他登入頁面上提交 TOTP 密碼。

您可以在 Amazon Cognito 主控台中或使用 Amazon Cognito API 操作，為您的使用者集區啟用 TOTP MFA。在使用者集區層級，您可以呼叫 [SetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserPoolMfaConfig.html) 來設定 MFA 並啟用 TOTP MFA。

**注意**  
如果您尚未啟用使用者集區的 TOTP 軟體權杖 MFA，Amazon Cognito 將無法使用該權杖建立關聯或驗證使用者。在此情況下，使用者會收到 `SoftwareTokenMFANotFoundException` 例外狀況和 `Software Token MFA has not been enabled by the userPool` 描述。如果停用使用者集區的軟體權杖 MFA，則先前已關聯並驗證 TOTP 權杖的使用者可以繼續將其用於 MFA。

為使用者設定 TOTP 是包含多步驟的程序，在此期間，您的使用者會收到一個秘密代碼，其需要輸入一次性密碼來進行驗證。接著，您可以為使用者啟用 TOTP MFA，或將 TOTP 設定為使用者偏好的 MFA 方法。

當您將使用者集區設定為需要 TOTP MFA，且使用者在受管登入中註冊應用程式時，Amazon Cognito 會自動執行使用者程序。Amazon Cognito 會提示您的使用者選擇 MFA 方法、顯示 QR 碼以設定其驗證器應用程式，並驗證其 MFA 註冊。在您允許使用者在 SMS 和 TOTP MFA 之間進行選擇的使用者集區中，Amazon Cognito 也會為您的使用者提供方法選擇。

**重要**  
當您的 AWS WAF Web ACL 與使用者集區相關聯，且 Web ACL 中的規則顯示 CAPTCHA 時，這可能會導致受管登入 TOTP 註冊發生無法復原的錯誤。若要建立具有 CAPTCHA 動作且不會影響受管登入 TOTP 的規則，請參閱 [設定您的 AWS WAF Web ACL 以進行受管登入 TOTP MFA](#totp-waf)。如需 AWS WAF Web ACL 和 Amazon Cognito 的相關資訊，請參閱[將 AWS WAF Web ACL 與使用者集區建立關聯](user-pool-waf.md)。

若要使用 AWS SDK 和 [Amazon Cognito 使用者集區 API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html) 在自訂建置的 UI 中實作 TOTP MFA，請參閱 [為使用者設定 TOTP MFA](#totp-mfa-set-up-api)。

若要在使用者集區中新增 MFA，請參閱 [將 MFA 新增到使用者集區](user-pool-settings-mfa.md)。

**TOTP MFA 考量與限制**

1. Amazon Cognito 透過會產生 TOTP 代碼的驗證器應用程式來支援軟體字符 MFA。Amazon Cognito 不支援以硬體為基礎的 MFA。

1. 當您的使用者集區向尚未設定 TOTP 的使用者要求 TOTP 時，使用者會收到一次性存取權杖，您的應用程式可用它來為該使用者啟用 TOTP MFA。後續的登入嘗試將會失敗，直到使用者註冊其他 TOTP 登入要素。
   + 使用 `SignUp` API 操作或透過受管登入在使用者集區中註冊的使用者，會在使用者完成註冊時收到一次性字符。
   + 在您建立使用者且使用者設定其初始密碼後，Amazon Cognito 會從受管登入向使用者發出一次性字符。如果您為使用者設定了永久性密碼，Amazon Cognito 會在使用者首次登入時發放一次性權杖。
   + Amazon Cognito 不會向管理員建立的使用者 (這些使用者使用 [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 操作) 發放一次性權杖。您的使用者在成功完成設定其初始密碼的挑戰之後，或者如果您為使用者設定了永久性密碼，Amazon Cognito 會立即要求使用者設定 MFA。

1. 如果使用者集區中需要 MFA 的使用者已收到一次性存取權杖，但尚未設定 TOTP MFA，則使用者必須先設定 MFA，才能使用受管登入來登入。您可以使用來自 `MFA_SETUP` 的 `session` 回應值挑戰 [AssociateSoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AssociateSoftwareToken.html) 請求中的 [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) 以取代存取字符。

1. 如果您的使用者已設定 TOTP，即使您稍後停用使用者集區的 TOTP，使用者仍可將其用於 MFA。

1. Amazon Cognito 只接受來自使用 HMAC-SHA1 雜湊函數產生程式碼之驗證器應用程式的 TOTPs。使用 SHA-256 雜湊產生的代碼會傳回 `Code mismatch` 錯誤。

## 為使用者設定 TOTP MFA
<a name="totp-mfa-set-up-api"></a>

當使用者首次登入時，您的應用程式將使用其一次性存取字符以產生 TOTP 私有金鑰，並以文字或 QR 碼格式呈現給使用者。您的使用者設定其驗證器應用程式，並為後續的登入嘗試提供 TOTP。您的應用程式或受管登入會在 MFA 挑戰回應中向 Amazon Cognito 顯示 TOTP。

在某些情況下，受管登入會提示新使用者設定 TOTP 驗證器。如需詳細資訊，請參閱 [使用者執行時間的 MFA 邏輯詳細資訊](user-pool-settings-mfa.md#user-pool-settings-mfa-user-outcomes)。

**Topics**
+ [與 TOTP 軟體字符關聯](#user-pool-settings-mfa-totp-associate-token)
+ [驗證 TOTP 字符](#user-pool-settings-mfa-totp-verification)
+ [使用 TOTP MFA 來登入](#user-pool-settings-mfa-totp-sign-in)
+ [移除 TOTP 權杖](#user-pool-settings-mfa-totp-remove)

### 與 TOTP 軟體字符關聯
<a name="user-pool-settings-mfa-totp-associate-token"></a>

若要關聯 TOTP 權杖，請傳送秘密代碼給您的使用者，秘密代碼必須使用一次性密碼進行驗證。關聯權杖需要三個步驟。

1. 當您的使用者選擇 TOTP 軟體字符 MFA 時，請呼叫 [AssociateSoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AssociateSoftwareToken.html)，為該使用者帳戶傳回唯一產生的共用私密金鑰代碼。您可以使用存取權杖或工作階段字串授權 AssociateSoftwareToken。

1. 您的應用程式向使用者顯示私有金鑰或是從私有金鑰產生的 QR 代碼。您的使用者必須在產生 TOTP 的應用程式中輸入金鑰，例如 Google Authenticator，方法是掃描應用程式從私有金鑰產生的 QR 碼，或手動輸入金鑰。

1. 您的使用者輸入金鑰，或將 QR 代碼掃描至驗證器應用程式 (如 Google Authenticator) 中，然後該應用程式開始產生代碼。

### 驗證 TOTP 字符
<a name="user-pool-settings-mfa-totp-verification"></a>

接下來，驗證 TOTP 權杖。向使用者請求範本代碼並將其提供給 Amazon Cognito 服務，以確認使用者是否已成功產生 TOTP 代碼，如下所示。

1. 您的應用程式會提示使用者輸入代碼，以證明其已正確設定驗證器應用程式。

1. 使用者的驗證器應用程式會顯示一個臨時密碼。驗證器應用程式的密碼以您給予使用者的私密金鑰為基礎。

1. 您的使用者輸入其臨時密碼。您的應用程式在 `[VerifySoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifySoftwareToken.html)` API 請求中，將臨時密碼傳遞給 Amazon Cognito。

1.  Amazon Cognito 保留了與使用者關聯的私密金鑰，產生 TOTP 並將其與您的使用者提供的私密金鑰進行比較。如果兩者相符，`VerifySoftwareToken` 會傳回 `SUCCESS` 回應。

1. Amazon Cognito 將 TOTP 要素與使用者建立關聯。

1. 如果 `VerifySoftwareToken` 操作傳回 `ERROR` 回應，請確定使用者的時鐘是正確的，而且沒有超過最大重試次數。Amazon Cognito 接受嘗試之前或之後 30 秒內的 TOTP 權杖，以解決微小的時鐘偏差問題。當您解決此問題後，請再次嘗試 VerifySoftwareToken 操作。

### 使用 TOTP MFA 來登入
<a name="user-pool-settings-mfa-totp-sign-in"></a>

此時，您的使用者會使用以時間為基礎的一次性密碼登入。程序如下。

1. 您的使用者要輸入其使用者名稱和密碼來登入您的用戶端應用程式。

1. 您的應用程式會叫用 TOTP MFA 挑戰，並提示使用者輸入臨時密碼。

1. 使用者從關聯的 TOTP 產生應用程式取得臨時密碼。

1. 使用者在您的用戶端應用程式中輸入 TOTP 代碼。您的應用程式通知 Amazon Cognito 服務加以驗證。每次登入都應呼叫 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)，以取得對新 TOTP 驗證挑戰的回應。

1. 如果權杖經過 Amazon Cognito 驗證，則登入成功，使用者可以繼續進行身分驗證流程。

### 移除 TOTP 權杖
<a name="user-pool-settings-mfa-totp-remove"></a>

最後，您的應用程式應允許使用者停用其 TOTP 組態。您目前無法刪除使用者的 TOTP 軟體權杖。若要取代使用者的軟體權杖，請關聯並驗證新的軟體權杖。若要停用使用者的 TOTP MFA，請呼叫 [SetUserMFAPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserMFAPreference.html) 修改您的使用者，使其不使用 MFA，或僅使用 SMS MFA。

1. 在您的應用程式中，為想要重設 MFA 的使用者建立一個介面。在此介面中提示使用者輸入其密碼。

1. 如果 Amazon Cognito 傳回 TOTP MFA 挑戰，請使用 [SetUserMFAPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserMFAPreference.html) 更新使用者的 MFA 偏好設定。

1. 在您的應用程式中，告知使用者他們已停用 MFA，並提示他們再次登入。

## 設定您的 AWS WAF Web ACL 以進行受管登入 TOTP MFA
<a name="totp-waf"></a>

當您的 AWS WAF Web ACL 與使用者集區相關聯，且 Web ACL 中的規則顯示 CAPTCHA 時，這可能會導致受管登入 TOTP 註冊時發生無法復原的錯誤。 AWS WAF CAPTCHA 規則*只會*對受管登入和傳統託管 UI 中的 TOTP MFA 產生此影響。SMS MFA 不受影響。

當您的 CAPTCHA 規則無法讓使用者完成 TOTP MFA 設定時，Amazon Cognito 會顯示下列錯誤。

Request not allowed due to WAF captcha. (由於 WAF captcha，不允許請求。)

當 AWS WAF 提示 CAPTCHA 回應使用者集區在背景提出的 [AssociateSoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AssociateSoftwareToken.html) 和 [VerifySoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifySoftwareToken.html) API 請求時，就會產生此錯誤。若要建立具有 CAPTCHA 動作且不會影響受管登入頁面中 TOTP 的規則，請在規則中排除 `VerifySoftwareToken` `AssociateSoftwareToken`和 的`x-amzn-cognito-operation-name`標頭值。

下列螢幕擷取畫面顯示範例 AWS WAF 規則，會將 CAPTCHA 動作套用至所有標頭`x-amzn-cognito-operation-name`值不是 `AssociateSoftwareToken`或 的請求`VerifySoftwareToken`。

![\[AWS WAF 規則的螢幕擷取畫面，會將 CAPTCHA 動作套用至沒有 AssociateSoftwareToken或 x-amzn-cognito-operation-name標頭值的所有請求VerifySoftwareToken。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/cup-WAF-rule-TOTP.png)


如需 AWS WAF Web ACLs 和 Amazon Cognito 的詳細資訊，請參閱 [將 AWS WAF Web ACL 與使用者集區建立關聯](user-pool-waf.md)。

# 具有威脅防護的進階安全性
<a name="cognito-user-pool-settings-threat-protection"></a>

建立使用者集區後，您可以在 Amazon Cognito 主控台的導覽功能表中存取**威脅防護**。您可以開啟威脅防護功能，並自訂為了回應不同風險而採取的動作。或者，您可以使用稽核模式來收集偵測到風險的指標，而不需要使用任何安全性緩解措施。在稽核模式中，威脅防護會將指標發佈至 Amazon CloudWatch。您可以在 Amazon Cognito 產生第一個事件後看到指標。請參閱 [檢視威脅防護指標](metrics-for-cognito-user-pools.md#user-pool-settings-viewing-threat-protection-metrics)。

威脅防護先前稱為*進階安全功能*，是一組用於使用者集區中不需要活動的監控工具，以及用於自動關閉潛在惡意活動的組態工具。威脅防護對於標準和自訂身分驗證操作有不同的組態選項。例如，您可能想要傳送通知給具有可疑自訂身分驗證登入的使用者，其中您已設定了其他安全因素，但使用基本的使用者名稱密碼身分驗證將使用者封鎖在相同的風險層級。

威脅防護可在 Plus 功能計劃中取得。如需詳細資訊，請參閱[使用者集區功能計劃](cognito-sign-in-feature-plans.md)。

下列使用者集區選項是威脅防護的元件。

**憑證洩漏**  
使用者重複使用多個使用者帳戶的密碼。Amazon Cognito 的憑證洩漏功能，會編譯公開洩漏的使用者名稱和密碼，然後將您的使用者憑證與洩漏憑證清單進行比較。憑證洩漏偵測也會檢查容易猜測的密碼。您可以在使用者集區中的username-and-password標準身分驗證流程中檢查憑證是否洩露。Amazon Cognito 不會在安全遠端密碼 (SRP) 或自訂身分驗證中偵測洩露的登入資料。  
您可以選擇提示檢查洩漏憑證的使用者動作，以及您希望 Amazon Cognito 採取的動作。對於登入、註冊和密碼變更事件，Amazon Cognito 可以 **封鎖登入** 或 **允許登入**。在這兩種情況下，Amazon Cognito 都會產生使用者活動日誌，您可以在其中找到有關事件的詳細資訊。  
**進一步了解**  
[使用遭盜用憑證偵測](cognito-user-pool-settings-compromised-credentials.md)

**自適應身分驗證**  
Amazon Cognito 可以檢閱使用者登入請求中的位置和裝置資訊，並套用自動回應來保護使用者集區中的使用者帳戶不受可疑活動影響。您可以監控使用者活動，並自動回應使用者名稱密碼和 SRP 中偵測到的風險等級，以及自訂身分驗證。  
當您啟用威脅防護時，Amazon Cognito 會為使用者活動指派風險分數。您可以為可疑活動指派自動回應：**需要 MFA**、**封鎖登入**，或僅記錄活動詳細資料和風險評分。您也可以自動傳送電子郵件訊息，通知您的使用者發現可疑活動，讓他們可以重設密碼或採取其他自助式動作。  
**進一步了解**  
[使用自適應身分驗證](cognito-user-pool-settings-adaptive-authentication.md)

**IP 地址允許清單和拒絕清單**  
在**全函**式模式下使用 Amazon Cognito 威脅保護時，您可以建立 IP 地址**永遠封鎖**和**永遠允許**例外狀況。來自 **Always block** (一律封鎖) 例外狀況列表上的 IP 地址的工作階段，未透過自適應身分驗證指派風險層級，而且無法登入到您的使用者集區。  

**IP 地址允許清單和封鎖清單的須知事項**
+ 您必須以 CIDR 格式表示 **Always 封鎖**和 **Always 允許**，例如 `192.0.2.0/24`、24 位元遮罩或 `192.0.2.252/32`、單一 IP 地址。
+  **始終封鎖** IP 範圍內 IP 地址的裝置無法使用 SDK 型或受管登入應用程式註冊或登入，但他們可以使用第三方 IdPs 登入。
+ **一律允許**和**一律封鎖**清單不會影響字符重新整理。
+ Amazon Cognito 不會將自適應身分驗證 MFA 規則套用至**永遠允許** IP 範圍的裝置，但會套用已洩露的憑證規則。

**日誌匯出**  
威脅防護會記錄使用者對使用者集區的身分驗證請求的精細詳細資訊。這些日誌具有威脅評估、使用者資訊和工作階段中繼資料，例如位置和裝置。您可以建立這些日誌的外部封存，以進行保留和分析。Amazon Cognito 使用者集區會將威脅防護日誌匯出至 Amazon S3、CloudWatch Logs 和 Amazon Data Firehose。如需詳細資訊，請參閱[檢視和匯出使用者事件歷史記錄](cognito-user-pool-settings-adaptive-authentication.md#user-pool-settings-adaptive-authentication-event-user-history)。  
**進一步了解**  
[匯出威脅防護使用者活動日誌](exporting-quotas-and-usage.md#exporting-quotas-and-usage-user-activity)

**Topics**
+ [威脅防護的考量和限制](#cognito-user-pool-threat-protection-considerations)
+ [在使用者集區中開啟威脅防護](#cognito-user-pool-threat-protection-activating)
+ [威脅防護強制執行概念](#cognito-user-pool-settings-threat-protection-threat-protection-enforcement)
+ [標準身分驗證和自訂身分驗證的威脅防護](#cognito-user-pool-settings-threat-protection-threat-protection-types)
+ [威脅防護先決條件](#cognito-user-pool-threat-protection-prerequisites)
+ [設定威脅防護](#cognito-user-pool-settings-configure-threat-protection)
+ [使用遭盜用憑證偵測](cognito-user-pool-settings-compromised-credentials.md)
+ [使用自適應身分驗證](cognito-user-pool-settings-adaptive-authentication.md)
+ [在應用程式中收集威脅防護的資料](user-pool-settings-viewing-threat-protection-app.md)

## 威脅防護的考量和限制
<a name="cognito-user-pool-threat-protection-considerations"></a>

**驗證流程之間的威脅防護選項不同**  
Amazon Cognito 支援使用身分驗證流程 和 進行自適應身分驗證`USER_PASSWORD_AUTH`和憑證洩露偵測`ADMIN_USER_PASSWORD_AUTH`。您只能為 啟用自適應身分驗證`USER_SRP_AUTH`。您無法搭配聯合登入使用威脅防護。

**一律封鎖 IPs 有助於請求配額**  
阻擋來自您使用者集區中的 **Always block** (一律封鎖) 例外狀況列表上的 IP 地址的請求，有助於您使用者集區的[請求速率配額](https://docs.aws.amazon.com/cognito/latest/developerguide/limits.html#category_operations)。

**威脅防護不會套用速率限制**  
有些惡意流量具有大量請求的特性，例如分散式阻斷服務 (DDoS) 攻擊。Amazon Cognito 套用至傳入流量的風險評分是依請求而定，不會考慮請求量。大量事件中的個別請求可能會因為應用程式層原因而收到風險分數和自動回應，這些原因與其在大量攻擊中的角色無關。若要在使用者集區中實作對抗容積攻擊的防禦，請新增 AWS WAF Web ACLs。如需詳細資訊，請參閱[將 AWS WAF Web ACL 與使用者集區建立關聯](user-pool-waf.md)。

**威脅防護不會影響 M2M 請求**  
用戶端憑證授與適用於機器對機器 (M2M) 授權，而不會與使用者帳戶連線。威脅防護只會監控使用者集區中的使用者帳戶和密碼。若要使用 M2M 活動實作安全功能，請考慮 AWS WAF 監控請求率和內容的功能。如需詳細資訊，請參閱[將 AWS WAF Web ACL 與使用者集區建立關聯](user-pool-waf.md)。

## 在使用者集區中開啟威脅防護
<a name="cognito-user-pool-threat-protection-activating"></a>

------
#### [ Amazon Cognito user pools console ]

**啟用使用者集區的威脅防護**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。如果出現提示，請輸入您的 AWS 登入資料。

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

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

1. 如果您尚未啟用，請從**設定**選單啟用 Plus 功能計劃。

1. 選擇**威脅防護**選單，然後選取**啟用**。

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

------
#### [ 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 請求中將您的功能計劃設定為 Plus。下列部分範例請求內文會將威脅防護設定為全功能模式。如需完整的範例請求，請參閱[範例](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#API_CreateUserPool_Examples)。

```
"UserPoolAddOns": { 
      "AdvancedSecurityMode": "ENFORCED"
   }
```

------

威脅防護是監控使用者操作是否有帳戶接管跡象並自動回應安全受影響使用者帳戶的功能的集體術語。您可以在使用者使用標準和自訂身分驗證流程登入時，將威脅防護設定套用至使用者。

威脅防護[會產生日誌](cognito-user-pool-settings-adaptive-authentication.md#user-pool-settings-adaptive-authentication-event-user-history)，詳細說明使用者的登入、登出和其他活動。您可以將這些日誌匯出至第三方系統。如需詳細資訊，請參閱[檢視和匯出使用者事件歷史記錄](cognito-user-pool-settings-adaptive-authentication.md#user-pool-settings-adaptive-authentication-event-user-history)。

## 威脅防護強制執行概念
<a name="cognito-user-pool-settings-threat-protection-threat-protection-enforcement"></a>

威脅防護會在*僅限稽核*模式下開始，使用者集區會監控使用者活動、指派風險層級，以及產生日誌。根據最佳實務，在啟用*完整函數*模式之前，請先以僅限稽核模式執行兩週或更長時間。全功能模式包含一組自動反應，可偵測出有風險的活動和洩露的密碼。使用僅限稽核模式，您可以監控 Amazon Cognito 正在執行的威脅評估。您也可以[提供意見回饋](cognito-user-pool-settings-adaptive-authentication.md#user-pool-settings-adaptive-authentication-feedback)，以訓練誤報和誤報的功能。

您可以在使用者集區層級設定威脅防護強制執行，以涵蓋使用者集區中的所有應用程式用戶端，以及在個別應用程式用戶端層級。應用程式用戶端威脅防護組態會覆寫使用者集區組態。若要設定應用程式用戶端的威脅防護，請從 Amazon Cognito 主控台中使用者集區的**應用程式用戶端**選單導覽至應用程式用戶端設定。您可以在其中**使用用戶端層級設定**，並設定應用程式用戶端獨有的強制執行。

此外，您可以針對標準和自訂身分驗證類型分別設定威脅防護。

## 標準身分驗證和自訂身分驗證的威脅防護
<a name="cognito-user-pool-settings-threat-protection-threat-protection-types"></a>

您可以設定威脅防護的方式取決於您在使用者集區和應用程式用戶端中進行的身分驗證類型。以下每種類型的身分驗證都可以有自己的強制執行模式和自動回應。

**標準身分驗證**  
*標準身分驗證*是使用者登入、登出和密碼管理，以及使用者名稱-密碼流程和受管登入。Amazon Cognito 威脅防護會在操作使用受管登入或使用下列 API `AuthFlow` 參數登入時，監控操作是否有風險指標：    
**[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthFlow)**  
`USER_PASSWORD_AUTH`、`USER_SRP_AUTH`。 遭入侵的登入資料功能無法存取`USER_SRP_AUTH`登入中的密碼，而且不會監控此流程的事件或對其採取行動。  
**[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-AuthFlow)**  
`ADMIN_USER_PASSWORD_AUTH`、`USER_SRP_AUTH`。 遭入侵的登入資料功能無法存取`USER_SRP_AUTH`登入中的密碼，而且不會監控此流程的事件或對其採取行動。
您可以將標準身分驗證的**強制執行模式**設定為**僅限稽核**或**完整函數**。若要停用標準身分驗證的威脅監控，請將威脅防護設定為**無強制執行**。

**自訂身分驗證**  
*自訂身分驗證*是使用[自訂挑戰 Lambda 觸發條件](user-pool-lambda-challenge.md)的使用者登入。您無法在受管登入中執行自訂身分驗證。Amazon Cognito 威脅防護會在操作使用 `InitiateAuth`和 `CUSTOM_AUTH`的 API `AuthFlow` 參數登入時，監控操作是否有風險指標`AdminInitiateAuth`。  
您可以將自訂身分驗證的**強制執行模式**設定為**僅限稽核**、**完整函數**或**無強制執行**。**無強制執行**選項會停用自訂身分驗證的威脅監控，而不會影響其他威脅防護功能。

## 威脅防護先決條件
<a name="cognito-user-pool-threat-protection-prerequisites"></a>

開始之前，您必須準備好以下事項：
+ 搭配應用程式用戶端的使用者集區。如需詳細資訊，請參閱[使用者集區入門](getting-started-user-pools.md)。
+ 在 Amazon Cognito 主控台中，將多重要素驗證 (MFA) 設定為 **Optional** (選用)，以使用風險型的適應性身分驗證功能。如需詳細資訊，請參閱[將 MFA 新增到使用者集區](user-pool-settings-mfa.md)。
+ 如果是使用電子郵件通知，請移至 [Amazon SES 主控台](https://console.aws.amazon.com/ses/home)，設定和驗證可搭配電子郵件通知使用的電子郵件地址或網域。如需 Amazon SES 的詳細資訊，請參閱[在 Amazon SES 中驗證身分](https://docs.aws.amazon.com/ses/latest/dg/verify-addresses-and-domains.html)。

## 設定威脅防護
<a name="cognito-user-pool-settings-configure-threat-protection"></a>

請依照這些指示來設定使用者集區威脅防護。

**注意**  
若要在 Amazon Cognito 使用者集區主控台中為應用程式用戶端設定不同的威脅防護組態，請從應用程式用戶端功能表中選取**應用程式用戶端**，然後選擇**使用用戶端層級設定**。

------
#### [ AWS 管理主控台 ]

**設定使用者集區的威脅防護**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。如果出現提示，請輸入您的 AWS 登入資料。

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

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

1. 選擇**威脅防護**選單，然後選取**啟用**。

1. 選擇您要設定的威脅防護方法：**標準和自訂身分驗證**。您可以為自訂和標準身分驗證設定不同的強制執行模式，但它們會在**完整函數**模式中共用自動回應的組態。

1. 選擇 **Edit** (編輯)。

1. 選擇**強制執行模式**。若要立即開始回應偵測到的風險，請選取**完整函數**，並針對遭到入侵的登入資料和適應性驗證設定自動回應。若要在使用者層級日誌和 CloudWatch 中收集資訊，請選取**僅稽核**。

   我們建議您在啟用動作之前，將威脅防護保持在稽核模式兩週。在此期間，Amazon Cognito 可以了解應用程式使用者的使用模式，並提供事件意見回饋來調整回應。

1. 如果您已選取 **Audit only** (僅稽核)，則請選擇 **Save changes** (儲存變更)。如果您已選取 **Full function** (完整功能)：

   1. 選取您是否要採取 **Custom** (自訂) 動作或使用 **Cognito defaults** (Cognito 預設值) 回應疑似 **Compromised credentials** (憑證洩漏)。**Cognito defaults** (Cognito 預設值) 是：

      1. 對 **Sign-in** (登入)、**Sign-up** (註冊) 和 **Password change** (密碼變更) 偵測憑證洩漏。

      1. 使用動作 **Block sign-in** (封鎖登入) 回應憑證洩漏。

   1. 如果您已為 **Compromised credentials** (憑證洩漏) 選取 **Custom** (自訂) 動作，請選擇 Amazon Cognito 會用於 **Event detection** (事件偵測) 的使用者集區動作，以及您希望 Amazon Cognito 採取的 **Compromised credentials responses (憑證洩漏回應)**。對於疑似洩漏憑證，您可以 **Block sign-in** (封鎖登入) 或 **Allow sign-in** (允許登入)。

   1. 在 **Adaptive authentication** (適應性身分驗證) 下方選擇如何回應惡意登入嘗試。選取您是否要採取 **Custom** (自訂) 動作或使用 **Cognito defaults** (Cognito 預設值) 回應疑似惡意活動。當您選取 **Cognito defaults** (Cognito 預設值) 時，Amazon Cognito 會封鎖所有風險等級的登入，且不會通知使用者。

   1. 如果您已選取適用於 **Adaptive authentication** (適應性身分驗證) 的 **Custom** (自訂) 動作，則請選擇 Amazon Cognito 將根據嚴重性層級回應已偵測到之風險採取的 **Automatic risk response** (自動風險回應) 動作。針對風險層級指派回應時，您無法將較低限制的回應指派給較高層級的風險。您可以將下列回應指派給風險層級：

      1. **Allow sign-in** (允許登入) – 不採取任何預防措施。

      1. **Optional MFA** (選用 MFA) – 如果使用者已設定 MFA，則 Amazon Cognito 會一律要求使用者在登入時提供額外的 SMS 或以時間為基礎的一次性密碼 (TOTP) 因素。如果使用者沒有設定 MFA，則他們可以繼續正常登入。

      1. **Require MFA** (需要 MFA) – 如果使用者已設定 MFA，則 Amazon Cognito 會一律要求使用者在登入時提供額外的 SMS 或 TOTP 因素。如果使用者沒有設定 MFA，則 Amazon Cognito 會提示他們設定 MFA。在自動為使用者要求 MFA 之前，請在應用程式中設定機制來擷取用於 SMS MFA 的電話號碼，或註冊用於 TOTP MFA 的驗證器應用程式。

      1. **封鎖登入** – 阻止使用者登入。

      1. **通知使用者** – 傳送電子郵件訊息給使用者，其中包含 Amazon Cognito 已偵測到之風險以及您採取之回應的資訊。您可以為傳送的訊息自訂電子郵件訊息範本。

1. 如果您已在上一步中選擇 **Notify user** (通知使用者)，則可以自訂電子郵件傳遞設定和電子郵件訊息範本，以進行適應性身分驗證。

   1. 在 **Email configuration** (電子郵件組態) 下，選擇您想要與適應性身分驗證搭配使用的 **SES Region** (SES 區域)、**FROM email address** (寄件者電子郵件地址)、**FROM sender name** (寄件者傳送人名稱) 以及 **REPLY-TO email address** (回覆至電子郵件地址)。如需將使用者集區電子郵件訊息與 Amazon Simple Email Service 整合的相關詳細資訊，請參閱 [Amazon Cognito 使用者集區的電子郵件設定](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-email.html)。  
![\[使用者事件歷史記錄\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/cup-advanced-security-ses-notification.png)

   1. 展開 **Email templates** (電子郵件範本)，自訂同時搭配 HTML 和純文字電子郵件訊息版本的適應性身分驗證通知。若要進一步了解電子郵件訊息範本，請參閱 [訊息範本](cognito-user-pool-settings-message-customizations.md#cognito-user-pool-settings-message-templates)。

1. 展開 **IP 地址例外**狀況，以建立**永遠允許**或**永遠封鎖**清單，列出一律允許或封鎖的 IPv4 或 IPv6 地址範圍，無論威脅防護風險評估為何。以 [CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation) (CIDR 表示法) 指定 IP 地址範圍 (如 192.168.100.0/24)。

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

------
#### [ API (user pool) ]

若要設定使用者集區的威脅防護組態，請傳送包含`UserPoolId`參數但不含`ClientId`參數的 [SetRiskConfiguration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetRiskConfiguration.html) 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 請求`ENFORCED`中`AdvancedSecurityMode`將 設定為 。如需`{username}`此範例中預留位置範本的詳細資訊，請參閱 [設定 MFA、身分驗證、驗證和邀請訊息](cognito-user-pool-settings-message-customizations.md)。

```
{
   "AccountTakeoverRiskConfiguration": { 
      "Actions": { 
         "HighAction": { 
            "EventAction": "MFA_REQUIRED",
            "Notify": true
         },
         "LowAction": { 
            "EventAction": "NO_ACTION",
            "Notify": true
         },
         "MediumAction": { 
            "EventAction": "MFA_IF_CONFIGURED",
            "Notify": true
         }
      },
      "NotifyConfiguration": { 
         "BlockEmail": { 
            "Subject": "You have been blocked for suspicious activity",
            "TextBody": "We blocked {username} at {login-time} from {ip-address}."
         },
         "From": "admin@example.com",
         "MfaEmail": { 
            "Subject": "Suspicious activity detected, MFA required",
            "TextBody": "Unexpected sign-in from {username} on device {device-name}. You must use MFA."
         },
         "NoActionEmail": { 
            "Subject": "Suspicious activity detected, secure your user account",
            "TextBody": "We noticed suspicious sign-in activity by {username} from {city}, {country} at {login-time}. If this was not you, reset your password."
         },
         "ReplyTo": "admin@example.com",
         "SourceArn": "arn:aws:ses:us-west-2:123456789012:identity/admin@example.com"
      }
   },
   "CompromisedCredentialsRiskConfiguration": { 
      "Actions": { 
         "EventAction": "BLOCK"
      },
      "EventFilter": [ "SIGN_UP" ]
   },
   "RiskExceptionConfiguration": { 
      "BlockedIPRangeList": [ "192.0.2.0/24","198.51.100.0/24" ],
      "SkippedIPRangeList": [ "203.0.113.0/24" ]
   },
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

------
#### [ API (app client) ]

若要設定應用程式用戶端的威脅防護組態，請傳送包含 `UserPoolId` 參數和 `ClientId` 參數的 [SetRiskConfiguration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetRiskConfiguration.html) 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 請求`ENFORCED`中`AdvancedSecurityMode`將 設定為 。如需`{username}`此範例中預留位置範本的詳細資訊，請參閱 [設定 MFA、身分驗證、驗證和邀請訊息](cognito-user-pool-settings-message-customizations.md)。

```
{
   "AccountTakeoverRiskConfiguration": { 
      "Actions": { 
         "HighAction": { 
            "EventAction": "BLOCK",
            "Notify": true
         },
         "LowAction": { 
            "EventAction": "NO_ACTION",
            "Notify": true
         },
         "MediumAction": { 
            "EventAction": "MFA_REQUIRED",
            "Notify": true
         }
      },
      "NotifyConfiguration": { 
         "BlockEmail": { 
            "Subject": "You have been blocked for suspicious activity",
            "TextBody": "We blocked {username} at {login-time} from {ip-address}."
         },
         "From": "admin@example.com",
         "MfaEmail": { 
            "Subject": "Suspicious activity detected, MFA required",
            "TextBody": "Unexpected sign-in from {username} on device {device-name}. You must use MFA."
         },
         "NoActionEmail": { 
            "Subject": "Suspicious activity detected, secure your user account",
            "TextBody": "We noticed suspicious sign-in activity by {username} from {city}, {country} at {login-time}. If this was not you, reset your password."
         },
         "ReplyTo": "admin@example.com",
         "SourceArn": "arn:aws:ses:us-west-2:123456789012:identity/admin@example.com"
      }
   },
   "ClientId": "1example23456789",
   "CompromisedCredentialsRiskConfiguration": { 
      "Actions": { 
         "EventAction": "BLOCK"
      },
      "EventFilter": [ "SIGN_UP", "SIGN_IN", "PASSWORD_CHANGE" ]
   },
   "RiskExceptionConfiguration": { 
      "BlockedIPRangeList": [ "192.0.2.1/32","192.0.2.2/32" ],
      "SkippedIPRangeList": [ "192.0.2.3/32","192.0.2.4/32" ]
   },
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

------

# 使用遭盜用憑證偵測
<a name="cognito-user-pool-settings-compromised-credentials"></a>

Amazon Cognito 可以偵測出使用者的使用者名稱和密碼是否已於其他位置洩漏。這種問題可能發生在使用者在多個網站上重複使用憑證，或使用者使用不安全的密碼。Amazon Cognito 會在受管登入和 Amazon Cognito API 中檢查使用使用者名稱和密碼登入的[本機使用者](cognito-terms.md#terms-localuser)。

從 Amazon Cognito 主控台**的威脅防護**選單中，您可以設定**遭入侵的登入**資料。設定 **Event detection (事件偵測)** 以選擇您想要監控憑證洩漏的使用者事件。設定 **Compromised credentials responses (憑證洩漏回應)** 以選擇如果偵測到憑證洩漏時，要允許或封鎖該名使用者。Amazon Cognito 可以檢查登入、註冊和密碼變更時期間憑證是否洩漏。

當您選擇 **Allow sign-in (允許登入)** 時，您可以檢閱 Amazon CloudWatch Logs 以監控 Amazon Cognito 對使用者事件進行的評估。如需詳細資訊，請參閱[檢視威脅防護指標](metrics-for-cognito-user-pools.md#user-pool-settings-viewing-threat-protection-metrics)。當您選擇 **Block sign-in** (封鎖登入) 時，Amazon Cognito 可防止使用已洩漏的憑證登入的使用者。Amazon Cognito 封鎖使用者登入時，會將使用者的 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserType.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserType.html) 設定為 `RESET_REQUIRED`。狀態為 `RESET_REQUIRED` 的使用者必須先變更其密碼，才能再次登入。

遭入侵的登入資料可以檢查下列使用者活動的密碼。

**註冊**  
您的使用者集區會檢查使用者在 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) 操作和受管登入的註冊頁面中傳輸的密碼，以找出入侵指標。

**登入**  
您的使用者集區會檢查使用者在密碼型登入中提交的密碼是否有入侵指標。Amazon Cognito 可以檢閱 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 中的`ADMIN_USER_PASSWORD_AUTH`流程、[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 中的`USER_PASSWORD_AUTH`流程，以及兩者中的`USER_AUTH`流程`PASSWORD`選項。  
目前 Amazon Cognito 不會針對使用安全遠端密碼 (SRP) 流程的登入操作，檢查憑證是否洩漏。SRP 會在登入期間傳送密碼雜湊函數。Amazon Cognito 無法從內部存取密碼，因此只能評估用戶端以純文字形式傳遞的密碼。

**密碼重設**  
您的使用者集區會檢查使用 [ConfirmForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html) 自助密碼重設操作設定新使用者密碼的操作中是否有入侵指標。此操作所需的程式碼是由 [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) 和 [AdminResetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html) 產生。  
遭入侵的登入資料不會檢查使用 [AdminSetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html) 設定的暫時或永久管理員設定密碼。不過，使用臨時密碼時，您的使用者集區會檢查回應 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) 和 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 中`NEW_PASSWORD_REQUIRED`挑戰的密碼。

若要將憑證洩漏保護新增到使用者集區，請參閱 [具有威脅防護的進階安全性](cognito-user-pool-settings-threat-protection.md)。

# 使用自適應身分驗證
<a name="cognito-user-pool-settings-adaptive-authentication"></a>

透過調適式身分驗證，您可以將使用者集區設定成封鎖可疑的登入，或是新增第二個要素身分驗證，以便回應更高的風險等級。每次嘗試登入時，Amazon Cognito 都會針對有關登入請求是否可能來自洩漏來源的風險情況進行評分。此風險分數是根據應用程式提供的裝置和使用者因素，以及 Amazon Cognito 從請求衍生的其他因素。Amazon Cognito 風險評估的一些因素包括 IP 地址、使用者代理程式，以及與其他登入嘗試的地理位置距離。當 Amazon Cognito 偵測到使用者工作階段中的風險，且使用者尚未選擇 MFA 方法時，調整型身分驗證可以為使用者集區中的使用者開啟或要求多重要素驗證 (MFA)。當您為使用者啟用 MFA 時，無論您如何設定調整型身分驗證，他們都會在驗證期間接到提供或設定第二個要素的挑戰。從使用者的角度來看，您的應用程式提供協助他們設定 MFA 的功能，而 Amazon Cognito 則可選擇防止他們再次登入，直到設定其他要素為止。

Amazon Cognito 會將有關登入嘗試、其風險等級和失敗挑戰的指標發佈至 Amazon CloudWatch。如需詳細資訊，請參閱[檢視威脅防護指標](metrics-for-cognito-user-pools.md#user-pool-settings-viewing-threat-protection-metrics)。

若要將適應性身分驗證新增到使用者集區，請參閱 [具有威脅防護的進階安全性](cognito-user-pool-settings-threat-protection.md)。

**Topics**
+ [適應性身分驗證概觀](#security-cognito-user-pool-settings-adaptive-authentication-overview)
+ [將使用者裝置與工作階段資料新增至 API 請求](#user-pool-settings-adaptive-authentication-device-fingerprint)
+ [檢視和匯出使用者事件歷史記錄](#user-pool-settings-adaptive-authentication-event-user-history)
+ [提供事件意見回饋](#user-pool-settings-adaptive-authentication-feedback)
+ [傳送通知訊息](#user-pool-settings-adaptive-authentication-messages)

## 適應性身分驗證概觀
<a name="security-cognito-user-pool-settings-adaptive-authentication-overview"></a>

從 Amazon Cognito 主控台**的威脅防護**選單中，您可以選擇適應性身分驗證的設定，包括在不同風險層級要採取的動作，以及自訂傳送給使用者的通知訊息。您可以將全域威脅防護組態指派給所有應用程式用戶端，但將用戶端層級組態套用至個別應用程式用戶端。

Amazon Cognito 適應性身分驗證會為每個使用者工作階段指派下列其中一個風險層級：**高**、**中**、**低**或**無風險**。

當您將 **Enforcement method** (強制執行方法) 從 **Audit-only** (僅供稽核使用) 變更為 **Full-function** (全功能) 時，請仔細考量您的選擇。您套用至風險等級的自動回應會影響 Amazon Cognito 指派給具有相同特性的後續使用者工作階段的風險等級。例如，在您選擇不採取任何動作或 **Allow** (允許) Amazon Cognito 最初評估為高風險的使用者工作階段後，Amazon Cognito 會將類似工作階段視為較低的風險。


**針對每個風險層級，有下列選項可供您選擇：**  

|  選項  |  Action  | 
| --- | --- | 
| 允許 | 使用者無需額外的要素即可登入。 | 
| 選用 MFA | 已經設定第二個要素的使用者必須通過第二個挑戰，才能成功登入。簡訊的電話號碼和 TOTP 軟體權杖是可用的第二個要素。沒有設定第二個要素的使用者只能使用一組憑證登入。 | 
| 需要 MFA | 已經設定第二個要素的使用者必須通過第二個挑戰，才能成功登入。Amazon Cognito 會阻擋未設定第二要素的使用者登入。 | 
| 封鎖 | Amazon Cognito 會阻擋指定風險層級的所有登入嘗試。 | 

**注意**  
您無需驗證電話號碼，即可將其使用於文字簡訊，作為第二個身分驗證要素。

## 將使用者裝置與工作階段資料新增至 API 請求
<a name="user-pool-settings-adaptive-authentication-device-fingerprint"></a>

當您使用 API 註冊、登入和重設密碼時，您可以收集使用者工作階段的相關資訊，並將其傳遞給 Amazon Cognito 威脅防護。此資訊包括使用者的 IP 地址和唯一裝置識別碼。

您的使用者與 Amazon Cognito 之間可能有一個中介網路裝置，如代理服務或應用程式伺服器。您可以收集使用者的內容資料，並將資料傳遞給 Amazon Cognito，讓調整性身分驗證根據使用者端點的特性來計算風險，而非根據您的伺服器或代理。如果您的用户端應用程式直接呼叫 Amazon Cognito API 操作，則調整性身分驗證會自動記錄來源 IP 地址。但是，它不會記錄如 `user-agent` 等其他裝置資訊，除非您也收集裝置指紋。

使用 Amazon Cognito 內容資料收集程式庫產生此資料，並使用 [ContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ContextDataType.html) 和 [UserContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserContextDataType.html) 參數將其提交至 Amazon Cognito 威脅防護。內容資料收集程式庫包含在 AWS SDKs中。如需詳細資訊，請參閱[將 Amazon Cognito 身分驗證和授權與 Web 和行動應用程式整合](cognito-integrate-apps.md)。`ContextData` 如果您有 Plus 功能計劃，您可以提交 。如需詳細資訊，請參閱[設定威脅防護](cognito-user-pool-settings-threat-protection.md#cognito-user-pool-settings-configure-threat-protection)。

當您從應用程式伺服器呼叫以下經過 Amazon Cognito 驗證的 API 操作時，請以 `ContextData` 參數傳遞使用者裝置的 IP。此外，傳遞您的伺服器名稱、伺服器路徑和編碼的裝置指紋資料。
+ [AdminInitiateAuth ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)
+ [AdminRespondToAuthChallenge ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)

當您呼叫 Amazon Cognito 未經驗證的 API 操作時，您可以提交`UserContextData`至 Amazon Cognito 威脅防護。此資料在 `EncodedData` 參數中包含裝置指紋。如果您滿足下列條件，則也可以在您的 `UserContextData` 中提交 `IpAddress` 參數：
+ 您的使用者集區位於 Plus 功能計劃中。如需詳細資訊，請參閱[使用者集區功能計劃](cognito-sign-in-feature-plans.md)。
+ 您的應用程式用户端具有用戶端密碼。如需詳細資訊，請參閱[使用應用程式用戶端的應用程式特定設定](user-pool-settings-client-apps.md)。
+ 您已在應用程式用户端中啟動 **Accept additional user context data (接受其他使用者內容資料)**。如需詳細資訊，請參閱[接受其他使用者內容資料 (AWS 管理主控台)](#user-pool-settings-adaptive-authentication-accept-user-context-data)。

您的應用程式可在以下 Amazon Cognito 未驗證的 API 操作中，將已編碼裝置的指紋資料與使用者裝置的 IP 地址填入 `UserContextData` 參數。
+ [InitiateAuth ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)
+ [RespondToAuthChallenge ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)
+ [SignUp ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html)
+ [ConfirmSignUp ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html)
+ [ForgotPassword ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html)
+ [ConfirmForgotPassword ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html)
+ [ResendConfirmationCode ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ResendConfirmationCode.html)

### 接受其他使用者內容資料 (AWS 管理主控台)
<a name="user-pool-settings-adaptive-authentication-accept-user-context-data"></a>

在您啟動 **Accept additional user context data (接受其他使用者內容資料)** 功能後，您的使用者集區會接受 `UserContextData` 參數中的 IP 地址。在下列情況下，您不需要啟動此功能：
+ 您的使用者僅透過如 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 等已驗證 API 操作登入，且您使用 `ContextData` 參數。
+ 您只希望未經驗證的 API 操作傳送裝置指紋，而不是 IP 地址給 Amazon Cognito 威脅防護。

在 Amazon Cognito 主控台中如下所示更新您的應用程式用戶端，以新增對其他使用者內容資料的支援。

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

1. 在導覽窗格中選擇 **Manage your User Pools** (管理您的使用者集區)，然後選擇您要編輯的使用者集區。

1. 選擇**應用程式用戶端**選單。

1. 選擇或建立應用程式用戶端。如需詳細資訊，請參閱[設定使用者集區應用程式用戶端](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html)。

1. 從 **App client information (應用程式用戶端資訊)** 容器中選擇 **Edit (編輯)**。

1. 在您應用程式用戶端的 ** Advanced authentication settings (進階驗證設定)** 中，選擇 **Accept additional user context data (接受其他使用者內容資料)**。

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

若要在 Amazon Cognito API 中設定應用程式用戶端以接受使用者內容資料，請在 [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) 或 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) 請求中將 `EnablePropagateAdditionalUserContextData` 設定為 `true`。如需有關如何在 Web 或行動應用程式中使用威脅防護的資訊，請參閱 [在應用程式中收集威脅防護的資料](user-pool-settings-viewing-threat-protection-app.md)。當您的應用程式從伺服器呼叫 Amazon Cognito 時，將從用戶端收集使用者內容資料。下面是使用 JavaScript SDK 方法 `getData` 的範例。

```
var EncodedData = AmazonCognitoAdvancedSecurityData.getData(username, userPoolId, clientId);
```

當您將應用程式設計為使用適應性身分驗證時，我們建議您將最新的 Amazon Cognito SDK 整合到您的應用程式中。SDK 的最新版本將收集裝置指紋資訊，例如裝置 ID、型號和時區。如需有關 Amazon Cognito SDK 的詳細資訊，請參閱[安裝使用者集區 SDK](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-sdk-links.html)。Amazon Cognito 威脅防護只會儲存並指派風險分數給應用程式以正確格式提交的事件。如果 Amazon Cognito 傳回錯誤回應，請檢查確認您的請求包含有效的私密雜湊，且 `IPaddress` 參數是有效的 IPv4 或 IPv6 地址。

**`ContextData` 和 `UserContextData` 資源**
+ AWS Amplify 適用於 Android 的 SDK：[GetUserContextData](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-cognitoidentityprovider/src/main/java/com/amazonaws/mobileconnectors/cognitoidentityprovider/CognitoUserPool.java#L626)
+ AWS Amplify 適用於 iOS 的 SDK：[userContextData](https://github.com/aws-amplify/aws-sdk-ios/blob/d3cd4fa0086b526f2f5c9c6c58880c9da7004c66/AWSCognitoIdentityProviderASF/AWSCognitoIdentityProviderASF.m#L21)
+ JavaScript：[amazon-cognito-advanced-security-data.min.js](https://amazon-cognito-assets.us-east-1.amazoncognito.com/amazon-cognito-advanced-security-data.min.js)

## 檢視和匯出使用者事件歷史記錄
<a name="user-pool-settings-adaptive-authentication-event-user-history"></a>

當您啟用威脅防護時，Amazon Cognito會為每個身分驗證事件產生日誌。根據預設，您可以在 Amazon Cognito 主控台的使用者功能表中或使用 [AdminListUserAuthEvents](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminListUserAuthEvents.html) API 操作來檢視**使用者**日誌。您也可以將這些事件匯出至外部系統，例如 CloudWatch Logs、Amazon S3 或 Amazon Data Firehose。匯出功能可讓您自己的安全分析系統更容易存取應用程式中使用者活動的安全資訊。

**Topics**
+ [檢視使用者事件歷史記錄 (AWS 管理主控台)](#user-pool-settings-adaptive-authentication-event-user-history-console)
+ [檢視使用者事件歷史記錄 (API/CLI)](#user-pool-settings-adaptive-authentication-event-user-history-api-cli)
+ [匯出使用者身分驗證事件](#user-pool-settings-adaptive-authentication-event-user-history-exporting)

### 檢視使用者事件歷史記錄 (AWS 管理主控台)
<a name="user-pool-settings-adaptive-authentication-event-user-history-console"></a>

若要查看使用者的登入歷史記錄，您可以從 Amazon Cognito 主控台的使用者選單中選擇**使用者**。使用者事件歷史記錄將由 Amazon Cognito 保留 2 年。

![\[使用者事件歷史記錄\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/cup-advanced-security-event-history.png)


每個登入事件都有一個事件 ID。事件還具有對應的內容資料，例如位置、裝置詳細資訊和風險偵測結果。

您還可以在事件 ID 與 Amazon Cognito 記錄事件時發放的字符之間建立關聯。ID 和存取權杖在其承載中包含此事件 ID。Amazon Cognito 還會在重新整理權杖使用與原始事件 ID 之間建立關聯。您可以將原始事件 ID 回溯至導致發放 Amazon Cognito 權杖之登入事件的事件 ID。您可以追溯系統中的字符使用記錄，以找出特定的身分驗證事件。如需詳細資訊，請參閱[了解使用者集區 JSON Web 字符 JWTs)](amazon-cognito-user-pools-using-tokens-with-identity-providers.md)。

### 檢視使用者事件歷史記錄 (API/CLI)
<a name="user-pool-settings-adaptive-authentication-event-user-history-api-cli"></a>

您可以使用 Amazon Cognito API 操作 [AdminListUserAuthEvents](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminListUserAuthEvents.html) 查詢使用者事件歷史記錄，或使用 [admin-list-user-auth-events](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-list-user-auth-events.html) 查詢 AWS Command Line Interface (AWS CLI)。

------
#### [ AdminListUserAuthEvents request ]

的下列請求內文會`AdminListUserAuthEvents`傳回一個使用者的最新活動日誌。

```
{
  "UserPoolId": "us-west-2_EXAMPLE", 
  "Username": "myexampleuser", 
  "MaxResults": 1
}
```

------
#### [ admin-list-user-auth-events request ]

下列 請求會`admin-list-user-auth-events`傳回一個使用者的最新活動日誌。

```
aws cognito-idp admin-list-user-auth-events --max-results 1 --username myexampleuser --user-pool-id us-west-2_EXAMPLE
```

------
#### [ Response ]

Amazon Cognito 會將相同的 JSON 回應內文傳回給這兩個請求。以下是找不到包含風險因素之受管登入事件的範例回應：

```
{
    "AuthEvents": [
        {
            "EventId": "[event ID]",
            "EventType": "SignIn",
            "CreationDate": "[Timestamp]",
            "EventResponse": "Pass",
            "EventRisk": {
                "RiskDecision": "NoRisk",
                "CompromisedCredentialsDetected": false
            },
            "ChallengeResponses": [
                {
                    "ChallengeName": "Password",
                    "ChallengeResponse": "Success"
                }
            ],
            "EventContextData": {
                "IpAddress": "192.168.2.1",
                "DeviceName": "Chrome 125, Windows 10",
                "Timezone": "-07:00",
                "City": "Bellevue",
                "Country": "United States"
            }
        }
    ],
    "NextToken": "[event ID]#[Timestamp]"
}
```

------

### 匯出使用者身分驗證事件
<a name="user-pool-settings-adaptive-authentication-event-user-history-exporting"></a>

設定您的使用者集區，將使用者事件從威脅防護匯出到外部系統。支援的外部系統 –Amazon S3、CloudWatch Logs 和 Amazon Data Firehose – 可能會為您傳送或擷取的資料增加 AWS 帳單成本。如需詳細資訊，請參閱[匯出威脅防護使用者活動日誌](exporting-quotas-and-usage.md#exporting-quotas-and-usage-user-activity)。

------
#### [ AWS 管理主控台 ]

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. 選擇**日誌串流**功能表。選擇 **Edit** (編輯)。

1. 在**記錄狀態**下，選取**啟用使用者活動日誌匯出**旁的核取方塊。

1. 在**記錄目的地**下，選擇您要處理日誌的 AWS 服務 ：**CloudWatch 日誌群組**、**Amazon Data Firehose 串流**或 **S3 儲存貯體**。

1. 您的選擇會將對應的資源類型填入資源選擇器。從清單中選擇日誌群組、串流或儲存貯體。您也可以選取**建立**按鈕，以導覽至所選服務的 AWS 管理主控台 ，並建立新的資源。

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

------
#### [ API ]

為您的使用者活動日誌選擇一種目的地類型。

以下是將 Firehose 串流設定為日誌目的地的範例`SetLogDeliveryConfiguration`請求內文。

```
{
   "LogConfigurations": [
      {
         "EventSource": "userAuthEvents",
         "FirehoseConfiguration": {
            "StreamArn": "arn:aws:firehose:us-west-2:123456789012:deliverystream/example-user-pool-activity-exported"
         },
         "LogLevel": "INFO"
      }
   ],
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

以下是將 Amazon S3 儲存貯體設定為日誌目的地`SetLogDeliveryConfiguration`的請求內文範例。

```
{
   "LogConfigurations": [
      {
         "EventSource": "userAuthEvents",
         "S3Configuration": { 
            "BucketArn": "arn:aws:s3:::amzn-s3-demo-logging-bucket"
         },
         "LogLevel": "INFO"
      }
   ],
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

以下是將 CloudWatch 日誌群組設定為日誌目的地的`SetLogDeliveryConfiguration`請求內文範例。

```
{
   "LogConfigurations": [
      {
         "EventSource": "userAuthEvents",
         "CloudWatchLogsConfiguration": { 
            "LogGroupArn": "arn:aws:logs:us-west-2:123456789012:log-group:DOC-EXAMPLE-LOG-GROUP"
         },
         "LogLevel": "INFO"
      }
   ],
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

------

## 提供事件意見回饋
<a name="user-pool-settings-adaptive-authentication-feedback"></a>

事件意見回饋會影響即時的風險評估，並可隨著時間改善風險評估演算法。您可以透過 Amazon Cognito 主控台和 API，在登入嘗試的有效期間內提供意見回饋。

**注意**  
您的事件意見回饋會影響 Amazon Cognito 指派給具有相同特性之後續使用者工作階段的風險等級。

在 Amazon Cognito 主控台中，從使用者功能表中選擇**使用者**，然後選取**提供事件意見回饋**。您可以查看事件詳細資訊，並 **Set as valid** (設定為有效) 或 **Set as invalid** (設定為無效)。

主控台會在使用者****選單的使用者詳細資訊中列出登入歷史記錄。如果您選取一個項目，可以將事件標記為有效或無效。您也可以透過使用者集區 API 操作 [AdminUpdateAuthEventFeedback](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateAuthEventFeedback.html)，以及透過 AWS CLI 命令 [admin-update-auth-event-feedback](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-update-auth-event-feedback.html) 提供意見回饋。

當您在 Amazon Cognito 主控台中選取 **Set as valid** (設定為有效) 或在 API 中為 `FeedbackValue` 提供 `valid` 值時，這會告訴 Amazon Cognito 您信任 Amazon Cognito 已評估具一定風險程度的使用者工作階段。當您在 Amazon Cognito 主控台中選取 **Set as invalid** (設定為無效) 或在 API 中提供 `invalid` 的 `FeedbackValue` 值時，您會告訴 Amazon Cognito 您不信任用者工作階段，或者您認為 Amazon Cognito 評估的風險程度不夠高。

## 傳送通知訊息
<a name="user-pool-settings-adaptive-authentication-messages"></a>

透過威脅防護，Amazon Cognito 可以通知使用者有風險的登入嘗試。Amazon Cognito 還可以提示使用者選取連結以指示登入是有效或無效。Amazon Cognito 使用此意見回饋來提高使用者集區的風險偵測準確性。

**注意**  
Amazon Cognito 只會在其動作產生自動風險回應時傳送通知訊息給使用者：封鎖登入、允許登入、將 MFA 設定為選用，或需要 MFA。有些請求可能會獲指派風險層級，但不會產生自適應身分驗證自動風險回應；因此，您的使用者集區不會傳送通知。例如，可能會以風險評分記錄不正確的密碼，但 Amazon Cognito 的回應是登入失敗，而不是套用自適應身分驗證規則。

於 **Automatic risk response** (自動風險回應) 區段中，選擇低度、中度和高度風險案例適用的 **Notify Users** (通知使用者)。

![\[通知使用者\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/cup-adaptive-auth.png)


Amazon Cognito 會傳送電子郵件通知給您的使用者，無論他們是否已驗證其電子郵件地址。

您可以自訂通知電子郵件訊息，並提供純文字和 HTML 兩種版本的訊息。若要自訂電子郵件通知，請在威脅防護組態中開啟**來自自適應身分驗證訊息****的電子郵件範本**。若要進一步了解電子郵件範本，請參閱 [訊息範本](cognito-user-pool-settings-message-customizations.md#cognito-user-pool-settings-message-templates)。

# 在應用程式中收集威脅防護的資料
<a name="user-pool-settings-viewing-threat-protection-app"></a>

Amazon Cognito [適應性身分驗證](cognito-user-pool-settings-adaptive-authentication.md)會從使用者登入嘗試的內容詳細資訊中，評估嘗試帳戶接管的風險等級。您的應用程式必須將*內容資料*新增至 API 請求，Amazon Cognito 威脅防護才能更準確地評估風險。內容資料是 IP 地址、瀏覽器代理程式、裝置資訊和請求標頭等資訊，提供使用者如何連接到使用者集區的相關內容資訊。

向 Amazon Cognito 提交此內容的應用程式的中心責任是對使用者集區的身分驗證請求中的`EncodedData`參數。若要將此資料新增至您的請求，您可以使用可自動產生此資訊的 開發套件來實作 Amazon Cognito，也可以實作用於 JavaScript、iOS 或 Android 的模組來收集此資料。直接向 Amazon Cognito 提出請求的*僅限用戶端*應用程式必須實作 AWS Amplify SDKs。具有中繼伺服器或 API 元件的*用戶端伺服器*應用程式必須實作個別的 SDK 模組。

在下列案例中，您的身分驗證前端會管理使用者內容資料收集，而不需要任何額外的組態：
+ 受管登入會自動收集內容資料並將其提交至威脅防護。
+ 所有 AWS Amplify 程式庫的身分驗證方法都內建內容資料收集。

## 使用 Amplify 在僅限用戶端應用程式中提交使用者內容資料
<a name="user-pool-settings-viewing-threat-protection-app-amplify"></a>

![\[Amplify 應用程式中威脅防護的資料收集概觀。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/user-pools-asf-amplify-data-collection.png)


Amplify SDKs支援直接使用 Amazon Cognito 進行身分驗證的行動用戶端。這類用戶端會對 Amazon Cognito 公有 API 操作提出直接 API 請求。Amplify 用戶端預設會自動收集威脅防護的內容資料。

使用 JavaScript 來 Amplify 應用程式是例外狀況。它們需要新增 [JavaScript 模組](#user-pool-settings-viewing-threat-protection-app-additional-resources-js)來收集使用者內容資料。

一般而言，此組態中的應用程式會使用未經驗證的 API 操作，例如 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 和 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)。[UserContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserContextDataType.html) 物件有助於更準確地評估這些操作的風險。Amplify SDKs會將裝置和工作階段資訊新增至 的 `EncodedData`參數`UserContextData`。

## 在用戶端伺服器應用程式中收集內容資料
<a name="user-pool-settings-viewing-threat-protection-app-server-side"></a>

有些應用程式具有前端層，可收集使用者身分驗證資料，以及向 Amazon Cognito 提交身分驗證請求的應用程式後端層。這是微服務支援的 Web 伺服器和應用程式中常見的架構。在這些應用程式中，您必須匯入公有內容資料收集程式庫。

![\[JavaScript 中具有威脅防護內容資料的伺服器端身分驗證概觀 JavaScript 。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/user-pools-asf-non-amplify-data-collection.png)


一般而言，此組態中的應用程式伺服器會使用已驗證的 API 操作，例如 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 和 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)。[ContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-ContextData) 物件可協助 Amazon Cognito 更準確地評估這些操作的風險。的內容`ContextData`是您的前端傳送到伺服器的編碼資料，以及來自使用者 HTTP 請求到伺服器的其他詳細資訊。這些額外的內容詳細資訊，例如 HTTP 標頭和 IP 地址，為您的應用程式伺服器提供使用者環境的特性。

您的應用程式伺服器也可能使用未經驗證的 API 操作登入，例如 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 和 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)。[UserContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-UserContextData) 物件會在這些操作中通知威脅防護風險分析。可用公有內容資料收集程式庫中的操作會將安全資訊新增至身分驗證請求中的 `EncodedData` 參數。此外，設定您的使用者集區以接受其他內容資料，並將使用者的來源 IP 新增至 的 `IpAddress` 參數`UserContextData`。

**將內容資料新增至用戶端伺服器應用程式**

1. 在前端應用程式中，使用 [iOS、Android 或 JavaScript 模組](#user-pool-settings-viewing-threat-protection-app-additional-resources)從用戶端收集編碼的內容資料。

1. 將編碼的資料和身分驗證請求的詳細資訊傳遞給您的應用程式伺服器。

1. 在您的應用程式伺服器中，從 HTTP 請求中擷取使用者的 IP 地址、相關的 HTTP 標頭、請求的伺服器名稱和請求的路徑。將這些值填入 Amazon Cognito API 請求的 [ContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-ContextData) 參數。

1. 使用 SDK 模組收集的編碼裝置資料填入 API 請求`ContextData`中的 `EncodedData` 參數。將此內容資料新增至身分驗證請求。

## 用戶端伺服器應用程式的內容資料程式庫
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources"></a>

### JavaScript
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-js"></a>

`amazon-cognito-advanced-security-data.min.js` 模組會收集您可以傳遞給應用程式伺服器的 `EncodedData` 。

將 `amazon-cognito-advanced-security-data.min.js` 模組新增至您的 JavaScript 組態。`<region>` 將 取代 AWS 區域 為下列清單中的 ：`us-east-1`、`us-east-2`、`eu-west-2`、、 `us-west-2` `eu-west-1`或 `eu-central-1`。

```
<script src="https://amazon-cognito-assets.<region>.amazoncognito.com/amazon-cognito-advanced-security-data.min.js"></script>
```

若要產生您可以在 `EncodedData` 參數中使用的`encodedContextData`物件，請將下列項目新增至 JavaScript 應用程式來源：

```
var encodedContextData = AmazonCognitoAdvancedSecurityData.getData(_username, _userpoolId, _userPoolClientId);
```

### iOS/Swift
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-ios"></a>

若要產生內容資料，iOS 應用程式可以整合[適用於 iOS 的 Mobile SDK](https://github.com/aws-amplify/aws-sdk-ios/tree/main) 模組 [AWSCognitoIdentityProviderASF](https://github.com/aws-amplify/aws-sdk-ios/tree/main/AWSCognitoIdentityProviderASF)。

若要收集用於威脅防護的編碼內容資料，請將下列程式碼片段新增至您的應用程式：

```
import AWSCognitoIdentityProviderASF

let deviceId = getDeviceId()
let encodedContextData = AWSCognitoIdentityProviderASF.userContextData(
                            userPoolId, 
                            username: username, 
                            deviceId: deviceId, 
                            userPoolClientId: userPoolClientId)
                                
/**
 * Reuse DeviceId from keychain or generate one for the first time.
 */
func getDeviceId() -> String {
    let deviceIdKey = getKeyChainKey(namespace: userPoolId, key: "AWSCognitoAuthAsfDeviceId")
    
   if let existingDeviceId = self.keychain.string(forKey: deviceIdKey) {
        return existingDeviceId
    }

    let newDeviceId = UUID().uuidString
    self.keychain.setString(newDeviceId, forKey: deviceIdKey)
    return newDeviceId
}

/**
 * Get a namespaced keychain key given a namespace and key
 */    
func getKeyChainKey(namespace: String, key: String) -> String {
    return "\(namespace).\(key)"
}
```

### Android
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-android"></a>

若要產生內容資料，Android 應用程式可以整合適用於 [Android 模組 aws-android-sdk-cognitoidentityprovider-asf 的 Mobile SDK](https://github.com/aws-amplify/aws-sdk-android/tree/main)。 [aws-android-sdk-cognitoidentityprovider-asf](https://github.com/aws-amplify/aws-sdk-android/tree/main/aws-android-sdk-cognitoidentityprovider-asf)

若要收集用於威脅防護的編碼內容資料，請將下列程式碼片段新增至您的應用程式：

```
UserContextDataProvider provider = UserContextDataProvider.getInstance();
// context here is android application context.
String encodedContextData = provider.getEncodedContextData(context, username, userPoolId, userPoolClientId);
```

# 將 AWS WAF Web ACL 與使用者集區建立關聯
<a name="user-pool-waf"></a>

AWS WAF 是 Web 應用程式防火牆。使用 AWS WAF Web 存取控制清單 (Web ACL)，您可以保護您的使用者集區免於對傳統託管 UI、受管登入和 Amazon Cognito API 服務端點提出不必要的請求。Web ACL 可讓您對使用者集區回應的所有 HTTPS Web 要求進行精細控制。如需有關 AWS WAF Web ACL 的詳細資訊，請參閱 *AWS WAF 開發人員指南*中的[管理和使用 Web 存取控制清單 (Web ACL)](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl.html)。

當您有與使用者集區相關聯的 AWS WAF Web ACL 時，Amazon Cognito 會將來自使用者的所選非機密標頭和請求內容轉送至 AWS WAF。 會 AWS WAF 檢查請求的內容，將其與您在 Web ACL 中指定的規則進行比較，並將回應傳回給 Amazon Cognito。

## AWS WAF Web ACLs 和 Amazon Cognito 的須知事項
<a name="user-pool-waf-things-to-know"></a>
+ 您無法設定 Web ACL 規則以符合使用者集區請求中的個人身分識別資訊 (PII)，例如使用者名稱、密碼、電話號碼或電子郵件地址。此資料將無法供 使用 AWS WAF。反之，請將 Web ACL 規則設定為與標頭、路徑和內文中的工作階段資料相符，例如 IP 地址、瀏覽器代理程式和請求的 API 操作。
+ Web ACL 規則條件只能將使用者**第一個**請求的自訂區塊回應傳回使用者互動受管登入頁面。當後續連線符合自訂區塊回應條件時，它們會傳回您的自訂狀態碼、標頭和重新導向回應，但會傳回預設區塊訊息。
+ 封鎖的請求 AWS WAF 不會計入任何請求類型的請求率配額。在 API 層級調節 AWS WAF 處理常式之前呼叫處理常式。
+ 當您建立 Web ACL 時，在 Web ACL 完全傳播並可供 Amazon Cognito 使用之前會經歷一小段時間。傳播時間可以是幾秒鐘到幾分鐘。當您嘗試在 Web ACL 完全傳播之前建立關聯[https://docs.aws.amazon.com/waf/latest/APIReference/API_AssociateWebACL.html#API_AssociateWebACL_Errors](https://docs.aws.amazon.com/waf/latest/APIReference/API_AssociateWebACL.html#API_AssociateWebACL_Errors)時， 會 AWS WAF 傳回 。
+ 您可以將一個 Web ACL 與每個使用者集區建立關聯。
+ 您的請求可能會導致負載大於 AWS WAF 可以檢查的限制。請參閱《 *AWS WAF 開發人員指南*》中的[過大請求元件處理](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-oversize-handling.html)，了解如何設定 如何處理來自 Amazon Cognito AWS WAF 的過大請求。
+ 您無法將使用 AWS WAF [Fraud Control 帳戶接管預防 (ATP)](https://docs.aws.amazon.com/waf/latest/developerguide/waf-atp.html) 的 Web ACL 與 Amazon Cognito 使用者集區建立關聯。ATP 功能位於`AWS-AWSManagedRulesATPRuleSet`受管規則群組中。將 Web ACL 與使用者集區建立關聯之前，請確定它不會使用此受管規則群組。
+ 當您的 AWS WAF Web ACL 與使用者集區相關聯，且 Web ACL 中的規則顯示 CAPTCHA 時，這可能會導致受管登入 TOTP 註冊發生無法復原的錯誤。若要建立具有 CAPTCHA 動作且不會影響受管登入 TOTP 的規則，請參閱 [設定您的 AWS WAF Web ACL 以進行受管登入 TOTP MFA](user-pool-settings-mfa-totp.md#totp-waf)。

AWS WAF 會檢查對下列端點的請求。

**受管登入和傳統託管 UI**  
對 [使用者集區端點和受管登入參考](cognito-userpools-server-contract-reference.md) 中所有端點的請求。

**公有 API 操作**  
從您的應用程式請求不使用 AWS 登入資料進行授權的 Amazon Cognito API。此包括如 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)、[RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) 和 [GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html) 的 API 作業。在 範圍內的 API 操作 AWS WAF 不需要使用 AWS 登入資料進行身分驗證。其未經身分驗證，或使用工作階段字串或存取字符進行授權。如需詳細資訊，請參閱[依授權模型分組的 API 操作清單](authentication-flows-public-server-side.md#user-pool-apis-auth-unauth)。

您可使用 **Count** (計數)、**Allow** (允許)、**Block** (封鎖) 或顯示 **CAPTCHA** (驗證碼) 以回應與規則相符之請求的規則作業，來設定 Web ACL 中的規則。如需詳細資訊，請參閱《*AWS WAF 開發人員指南*》中的 [AWS WAF 規則](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rules.html)。依據規則動作，您可自訂 Amazon Cognito 傳回給使用者的回應。

**重要**  
自訂錯誤回應的選項取決於您提出 API 請求的方式。  
您可以自訂受管登入請求的錯誤碼和回應內文。您只能為使用者提供 CAPTCHA，以便在受管登入中解決此問題。
對於您使用 Amazon Cognito [使用者集區 API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html) 提出的請求，您可自訂接收 **封鎖** 回應請求的回應主體。您還可於 400–499 範圍內指定自訂錯誤代碼。
 AWS Command Line Interface (AWS CLI) 和 AWS SDKs會傳回`ForbiddenException`錯誤給產生**區塊**或 **CAPTCHA** 回應的請求。

## 將 Web ACL 與您的使用者集區建立關聯
<a name="user-pool-waf-setting-up"></a>

若要在使用者集區中使用 Web ACL，您的 AWS Identity and Access Management (IAM) 主體必須具有下列 Amazon Cognito 和 AWS WAF 許可。如需 AWS WAF 許可的相關資訊，請參閱《 *AWS WAF 開發人員指南*》中的 [AWS WAF API 許可](https://docs.aws.amazon.com/waf/latest/developerguide/waf-api-permissions-ref.html)。

------
#### [ JSON ]

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Sid": "AllowWebACLUserPool",
			"Effect": "Allow",
			"Action": [
				"cognito-idp:ListResourcesForWebACL",
				"cognito-idp:GetWebACLForResource",
				"cognito-idp:AssociateWebACL"
			],
			"Resource": [
				"arn:aws:cognito-idp:*:123456789012:userpool/*"
			]
		},
		{
			"Sid": "AllowWebACLUserPoolWAFv2",
			"Effect": "Allow",
			"Action": [
				"wafv2:ListResourcesForWebACL",
				"wafv2:AssociateWebACL",
				"wafv2:DisassociateWebACL",
				"wafv2:GetWebACLForResource"
			],
			"Resource": "arn:aws:wafv2:*:123456789012:*/webacl/*/*"
		},
		{
			"Sid": "DisassociateWebACL1",
			"Effect": "Allow",
			"Action": "wafv2:DisassociateWebACL",
			"Resource": "*"
		},
		{
			"Sid": "DisassociateWebACL2",
			"Effect": "Allow",
			"Action": [
				"cognito-idp:DisassociateWebACL"
			],
			"Resource": [
				"arn:aws:cognito-idp:*:123456789012:userpool/*"
			]
		}
	]
}
```

------

雖然您必須授予 IAM 許可，但列出的動作僅限許可，不會對應至任何 [API 操作](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html)。

**AWS WAF 為您的使用者集區啟用 並關聯 Web ACL**

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

1. 在導覽窗格中，選擇 **User Pools** (使用者集區)，然後選擇您要編輯的使用者集區。

1. 選擇**安全**區段中的**AWS WAF**索引標籤。

1. 選擇**編輯**。

1. 選取** AWS WAF 搭配您的使用者集區使用**。  
![\[AWS WAF 對話方塊的螢幕擷取畫面，其中已選取使用 AWS WAF 搭配您的使用者集區。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/cup-WAF-console.png)

1. 選擇您已建立的 **AWS WAF Web ACL**，或選擇在 **中建立 Web ACL AWS WAF**，以在 的新 AWS WAF 工作階段中建立一個 AWS 管理主控台。

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

若要以程式設計方式將 Web ACL 與 AWS Command Line Interface 或 SDK 中的使用者集區建立關聯，請從 AWS WAF API 使用 [AssociateWebACL](https://docs.aws.amazon.com/waf/latest/APIReference/API_AssociateWebACL.html)。Amazon Cognito 沒有關聯 Web ACL 的單獨 API 操作。

## 測試和記錄 AWS WAF Web ACLs
<a name="user-pool-waf-evaluating-and-logging"></a>

當您將規則動作設定為 Web ACL 中的**計數**時， 會將請求 AWS WAF 新增至符合規則的請求計數。如要使用您的使用者集區測試 Web ACL，請將規則動作設定為 **Count** (計數)，並考慮與每個規則相符的請求量。例如，若您要設定為 **Block** (封鎖) 動作的規則與您確定為正常使用者流量的大量請求相符合，您可能需要重新設定您的規則。如需詳細資訊，請參閱《 開發人員指南》中的[測試和調校您的 AWS WAF 保護](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-testing.html)。 *AWS WAF *

您也可以設定 AWS WAF 將請求標頭記錄到 Amazon CloudWatch Logs 日誌群組、Amazon Simple Storage Service (Amazon S3) 儲存貯體或 Amazon Data Firehose。您可透過 `x-amzn-cognito-client-id` 和 `x-amzn-cognito-operation-name` 識別您使用使用者集區 API 提出的 Amazon Cognito 請求。受管登入請求僅包含 `x-amzn-cognito-client-id`標頭。如需詳細資訊，請參閱《*AWS WAF 開發人員指南*》中的[記錄 Web ACL 流量](https://docs.aws.amazon.com/waf/latest/developerguide/logging.html)。

AWS WAF Web ACLs可在所有使用者集區[功能計劃](cognito-sign-in-feature-plans.md)中使用。的安全功能可 AWS WAF 補充 Amazon Cognito 威脅防護。您可於使用者集區中啟動這兩項功能。 AWS WAF 會單獨用於檢查使用者集區請求的帳單。如需詳細資訊，請參閱[AWS WAF 定價](https://aws.amazon.com/waf/pricing)。

記錄 AWS WAF 請求資料需由您以日誌為目標的服務額外計費。如需詳細資訊，請參閱《*AWS WAF 開發人員指南*》中的[記錄 Web ACL 流量資訊的定價](https://docs.aws.amazon.com/waf/latest/developerguide/logging.html#logging-pricing)。

# 使用者集區大小寫區分
<a name="user-pool-case-sensitivity"></a>

根據預設，您在 中建立的 Amazon Cognito AWS 管理主控台 使用者集區不區分大小寫。當使用者集區不區分大小寫時，*user@example.com* 和 *User@example.com* 是指同一名使用者。當使用者集區的使用者名稱不區分大小寫時，`preferred_username` 和 `email` 屬性也不會區分大小寫。

不敏感案例不僅適用於屬性輸入，也適用於輸出。不區分大小寫的使用者集區中的混合大小寫屬性值會在使用者集區文字輸出中扁平化為小寫。使用者集區文字輸出的範例包括 [userInfo](userinfo-endpoint.md) 回應、[GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html) 輸出等使用者查詢回應，以及 [Lambda 觸發的](cognito-user-pools-working-with-lambda-triggers.md)輸入事件。

若要將使用者集區的大小寫區分設定納入考慮，應根據替代使用者屬性，在應用程式的程式碼中識別使用者。由於是使用者名稱、偏好的使用者名稱或電子郵件地址屬性在不同的使用者描述檔中可能會有所不同，因此請改為參閱 `sub` 屬性。您也可以在使用者集區中建立不可變的自訂屬性，並在每個新的使用者描述檔中，將自己的唯一識別符值指派給屬性。首次建立使用者時，您可以將值寫入您建立的不可變自訂屬性中。

**注意**  
無論使用者集區的區分大小寫設定如何，Amazon Cognito 都會要求來自 SAML 或 OIDC 身分提供者 (IdP) 的聯合身分使用者傳遞唯一且區分大小寫的 `NameId` 或 `sub` 宣告。如需唯一識別符區分大小寫和 SAML IdP 的詳細資訊，請參閱 [實作 SP 初始化的 SAML 登入](cognito-user-pools-SAML-session-initiation.md#cognito-user-pools-saml-idp-authentication)。

建立區分大小寫的使用者集區  
如果您使用 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 等 AWS Command Line Interface (AWS CLI) 和 API 操作建立資源，則必須將布林值`CaseSensitive`參數設定為 `false`。此設定會建立不區分大小寫的使用者集區。如果您不指定值，`CaseSensitive` 會預設為 `true`。您在 Amazon Cognito 主控台中建立的使用者集區不區分大小寫。若要產生區分大小寫的使用者集區，您必須使用 `CreateUserPool`操作。在 2020 年 2 月 12 日之前，無論平台為何，使用者集區皆預設為區分大小寫。  
在 **的登入**選單和 [DescribeUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserPoolType.html#CognitoUserPools-Type-UserPoolType-UsernameConfiguration) 的 `UsernameConfiguration` 屬性中，您可以檢閱帳戶中每個使用者集區的區分大小寫設定。 AWS 管理主控台 

遷移至新的使用者集區  
由於使用者描述檔之間的潛在衝突，您無法將 Amazon Cognito 使用者集區從區分大小寫變成不區分大小寫。替代方法為將您的使用者遷移到新的使用者集區。您必須建置遷移代碼以解決與大小寫相關的衝突。此代碼必須傳回唯一的新使用者，或者在偵測到衝突時拒絕登入嘗試。在新的不區分大小寫的使用者集區中，指派一個 [遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md)。 AWS Lambda 函數可以在不區分大小寫的新使用者集區中建立使用者。當使用者無法成功登入不區分大小寫的使用者集區時，Lambda 函數會從區分大小寫的使用者集區中查找並複製使用者。您還可以針對 [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) 事件啟用遷移使用者 Lambda 觸發程序。Amazon Cognito 會將登入或密碼恢復動作中的使用者資訊和事件中繼資料傳遞至您的 Lambda 函數。當函數在不區分大小寫的使用者集區中建立新使用者時，您可以使用事件資料來管理使用者名稱與電子郵件地址之間的衝突。這些衝突會在區分大小寫的使用者集區中是唯一的使用者名稱和電子郵件地址之間發生，但在不區分大小寫的使用者集區中是相同的。  
如需如何在 Amazon Cognito 使用者集區之間使用遷移使用者 Lambda 觸發程序的詳細資訊，請參閱 AWS 部落格中的[將使用者遷移至 Amazon Cognito 使用者集區](https://aws.amazon.com/blogs/mobile/migrating-users-to-amazon-cognito-user-pools/)。

# 使用者集區刪除保護
<a name="user-pool-settings-deletion-protection"></a>

若要讓系統管理員不會意外刪除您的使用者集區，請啟用刪除保護。在啟用刪除保護的情況下，您必須先確認是否要刪除使用者集區，然後才能刪除使用者集區。當您在 中刪除使用者集區時 AWS 管理主控台，您可以同時停用刪除保護。當您接受停用刪除保護的提示並確認想要刪除 (如下圖所示) 時，Amazon Cognito 會刪除您的使用者集區。

![\[的螢幕擷取畫面， AWS 管理主控台 顯示刪除使用者集區的提示，其中包含同時停用刪除保護的提示。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/amazon-cognito-delete-user-pool-deactivate-deletion-protection.png)


當您想要刪除具有 Amazon Cognito API 請求的使用者集區時，必須先在 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) 請求中將 `DeletionProtection` 變更為 `Inactive`。如果您沒有停用刪除保護，Amazon Cognito 會傳回 `InvalidParameterException` 錯誤訊息。停用刪除保護後，您可以在 [DeleteUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUserPool.html) 請求中刪除使用者集區。

在 AWS 管理主控台建立新使用者集區時，Amazon Cognito 預設會啟用 **Deletion protection** (刪除保護)。當您使用`CreateUserPool` API 建立使用者集區，刪除保護預設處於停用狀態。若要在您透過 AWS CLI 或 AWS SDK 建立的使用者集區中使用此功能，請將 `DeletionProtection` 參數設定為 `True`。

您可以在 Amazon Cognito 主控台**的設定**選單中的**刪除保護容器中啟用或停用刪除保護**狀態。

# 設定刪除保護


1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。系統可能會提示您輸入 AWS 登入資料。

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

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

1. 選擇**設定**選單，然後導覽至**刪除保護**索引標籤。選取**啟用或停用******。

1. 在下一個對話框中確認您的選擇。

# 管理使用者存在錯誤回應
<a name="cognito-user-pool-managing-errors"></a>

Amazon Cognito 支援自訂使用者集區傳回的錯誤回應。自訂錯誤回應可用於使用者建立和身分驗證、密碼復原和確認操作。

使用使用者集區應用程式用戶端的 `PreventUserExistenceErrors` 設定，啟用或停用已有使用者相關錯誤。當您使用 Amazon Cognito 使用者集區 API 建立新的應用程式用戶端時， 預設為 `PreventUserExistenceErrors` `LEGACY`或 停用。在 Amazon Cognito 主控台中，預設`PreventUserExistenceErrors`會選取**防止使用者存在錯誤 **- `ENABLED` 的 設定。若要更新您的`PreventUserExistenceErrors`組態，請執行下列其中一項操作：
+ 在 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) API 請求`LEGACY`中變更介於 `ENABLED`和 `PreventUserExistenceErrors`之間的值。
+ 在 Amazon Cognito 主控台中編輯您的應用程式用戶端，並變更**防止使用者在所選 () 和取消選取 () 之間存在錯誤**的狀態`LEGACY`。`ENABLED`

當此屬性的值為 時`LEGACY`，當使用者嘗試使用不存在於使用者集區中的使用者名稱登入時，您的應用程式用戶端會傳回`UserNotFoundException`錯誤回應。

當此屬性的值為 時`ENABLED`，您的應用程式用戶端不會揭露使用者集區中使用者帳戶不存在的`UserNotFoundException`錯誤。當您提交不存在使用者名稱的請求時， 的`PreventUserExistenceErrors`組態`ENABLED`具有以下效果：
+ Amazon Cognito 會以非特定資訊回應 API 請求，否則其回應可能會揭露有效的使用者存在。
+ Amazon Cognito 會傳回一般身分驗證失敗回應給忘記密碼請求，以及傳回給具有身分驗證流程的身分驗證請求，但[選擇型身分驗證](authentication-flows-selection-sdk.md#authentication-flows-selection-choice) (`USER_AUTH`) *除外*，例如 `USER_SRP_AUTH`或 `CUSTOM_AUTH`。錯誤回應會告訴您使用者名稱或密碼不正確。
+ Amazon Cognito 會使用使用者集區允許的挑戰類型中的隨機選擇來回應以選擇為基礎的身分驗證請求。您的使用者集區可能會傳回通行金鑰、一次性密碼或密碼挑戰。
+ Amazon Cognito 帳戶確認和密碼復原 APIs的行為會交替傳回回應，指出程式碼已傳送至模擬交付媒體並傳回`InvalidParameterException`錯誤。

下列資訊詳細說明當 `PreventUserExistenceErrors`設定為 時，使用者集區操作的行為`ENABLED`。

## 身分驗證和使用者建立操作
<a name="cognito-user-pool-managing-errors-user-auth"></a>

您可以在使用者名稱密碼和安全遠端密碼 (SRP) 身分驗證中設定錯誤回應。您也可以自訂使用自訂身分驗證傳回的錯誤。以選擇為基礎的身分驗證不受您的`PreventUserExistenceErrors`組態影響。身分驗證流程中的使用者存在公開詳細資訊

**以選擇為基礎的身分驗證**  
在以`USER_AUTH`選擇為基礎的身分驗證流程中，Amazon Cognito 會根據您的使用者集區組態和使用者的屬性，從可用的主要身分驗證因素傳回挑戰。此身分驗證流程可以傳回密碼、安全遠端密碼 (SRP)、WebAuthn （密碼金鑰）、簡訊一次性密碼 (OTP) 或電子郵件 OTP 挑戰。使用`PreventUserExistenceErrors`作用中時，Amazon Cognito 會對不存在的使用者發出挑戰，以完成一或多個可用的身分驗證形式。使用`PreventUserExistenceErrors`非作用中時，Amazon Cognito 會傳回`UserNotFound`例外狀況。

**使用者名稱和密碼身分驗證**  
當 `PreventUserExistenceErrors`處於作用中狀態`Incorrect username or password`時`USER_PASSWORD_AUTH`，身分驗證流程 `ADMIN_USER_PASSWORD_AUTH`、 和 會`USER_AUTH`傳回`NotAuthorizedException`具有 訊息的 `PASSWORD`流程。當 `PreventUserExistenceErrors` 處於非作用中狀態時，這些流程會傳回 `UserNotFoundException`。

**安全遠端密碼 (SRP) 型身分驗證**  
最佳實務是，僅在沒有電子郵件地址、電話號碼`USER_SRP_AUTH`或偏好的使用者名稱[別名屬性](user-pool-settings-attributes.md#user-pool-settings-aliases)的使用者集區`USER_AUTH`中`PreventUserExistenceErrors`實作 或 `PASSWORD_SRP`流程。具有別名屬性的使用者可能不會受到 SRP 身分驗證流程中的使用者存在抑制。使用者名稱-密碼身分驗證流程 —`ADMIN_USER_PASSWORD_AUTH`、 `USER_PASSWORD_AUTH`和 `USER_AUTH``PASSWORD`挑戰 — 完全禁止來自別名屬性的使用者存在。  
當有人嘗試使用應用程式用戶端不知道的使用者名稱登入 SRP 時，Amazon Cognito 會在第一個步驟中傳回模擬回應，如 [RFC 5054 ](https://tools.ietf.org/html/rfc5054#section-2.5.1.3)中所述。Amazon Cognito 會針對相同的使用者名稱和使用者集區組合，傳回 [UUID](cognito-terms.md#terms-uuid) 格式的相同 salt 和內部使用者 ID。傳送附密碼證明的 `RespondToAuthChallenge` API 請求時，若使用者名稱或密碼不正確，Amazon Cognito 會傳回一般 `NotAuthorizedException` 錯誤。如需 SRP 身分驗證實作的詳細資訊，請參閱 [使用持久性密碼和安全承載登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp)。  
如果您使用以驗證為基礎的別名屬性，而且不可變的使用者名稱未格式化為 [UUID](cognito-terms.md#terms-uuid)，則可以使用使用者名稱和密碼身分驗證來模擬一般回應。

**自訂身分驗證挑戰 Lambda 觸發程序**  
當使用者嘗試使用身分驗證流程登入，但找不到其使用者名稱時，Amazon Cognito 會叫用自訂`CUSTOM_AUTH`身分驗證挑戰 Lambda 觸發。 [自訂身分驗證挑戰 Lambda 觸發程序](user-pool-lambda-challenge.md)輸入事件包含名為 的布林值參數`UserNotFound`，任何不存在的使用者的值`true`為 。此參數會出現在使用者集區傳送至建立、定義和驗證組成自訂身分驗證架構之驗證挑戰 Lambda 函數的請求事件中。當您在 Lambda 函數的邏輯中檢查此指標時，您可以模擬不存在之使用者的自訂身分驗證挑戰。

**身分驗證前 Lambda 觸發程序**  
當使用者嘗試登入但找不到使用者名稱時，Amazon Cognito 會叫用身分[驗證前觸發](user-pool-lambda-pre-authentication.md)條件。輸入事件包含`UserNotFound`參數，值`true`為 ，適用於任何不存在的使用者。

以下清單說明 `PreventUserExistenceErrors`對使用者帳戶建立的影響。使用者建立流程中的使用者存在公開詳細資訊

**SignUp**  
`SignUp` 操作一律會在已使用使用者名稱`UsernameExistsException`時傳回 。如果您不希望 Amazon Cognito 在應用程式中註冊使用者時，傳回電子郵件地址和電話號碼的 `UsernameExistsException` 錯誤訊息，請使用驗證型別名屬性。如需關於別名的詳細資訊，請參閱[自訂登入屬性](user-pool-settings-attributes.md#user-pool-settings-aliases)。  
如需 Amazon Cognito 如何防止使用 `SignUp` API 請求來探索使用者集區中使用者的範例，請參閱 [防止註冊時出現電子郵件地址和電話號碼 `UsernameExistsException` 錯誤](#cognito-user-pool-managing-errors-prevent-userexistence-errors)。

**匯入的使用者**  
如果啟用 `PreventUserExistenceErrors`，在驗證匯入的使用者期間，系統會傳回一般 `NotAuthorizedException` 錯誤，指出使用者名稱或密碼不正確，而不是傳回 `PasswordResetRequiredException`。如需詳細資訊，請參閱[需要匯入的使用者重設密碼](cognito-user-pools-using-import-tool.md#cognito-user-pools-using-import-tool-password-reset)。

**遷移使用者 Lambda 觸發器**  
Amazon Cognito 會在 Lambda 觸發器於原始活動內容中設定空白回應時，傳回不存在使用者的模擬回應。如需詳細資訊，請參閱[透過使用者遷移 Lambda 觸發程序匯入使用者](cognito-user-pools-import-using-lambda.md)。

### 防止註冊時出現電子郵件地址和電話號碼 `UsernameExistsException` 錯誤
<a name="cognito-user-pool-managing-errors-prevent-userexistence-errors"></a>

下列範例示範如何在使用者集區中設定別名屬性時，避免重複的電子郵件地址和電話號碼產生 `UsernameExistsException` 錯誤以回應 `SignUp` API 請求。您必須建立使用者集區，並將電子郵件地址或電話號碼作為別名屬性。如需詳細資訊，請參閱使用者集區屬性的*自訂登入屬性*一節。

1. Jie 註冊一個新的使用者名稱，也提供電子郵件地址 `jie@example.com`。Amazon Cognito 會將代碼傳送至其電子郵件地址。

   **範例 AWS CLI 命令**

   ```
   aws cognito-idp sign-up --client-id 1234567890abcdef0 --username jie --password PASSWORD --user-attributes Name="email",Value="jie@example.com"
   ```

   **回應範例**

   ```
   {
       "UserConfirmed": false, 
       "UserSub": "<subId>", 
       "CodeDeliveryDetails": {
           "AttributeName": "email", 
           "Destination": "j****@e****", 
           "DeliveryMedium": "EMAIL"
       }
   }
   ```

1. Jie 提供傳送給他們的代碼，以確認他們對電子郵件地址的所有權。這樣就完成了他們作為使用者的註冊。

   **範例 AWS CLI 命令**

   ```
   aws cognito-idp confirm-sign-up --client-id 1234567890abcdef0 --username=jie --confirmation-code xxxxxx
   ```

1. Shirley 註冊一個新的使用者帳戶並提供電子郵件地址 `jie@example.com`。Amazon Cognito 不會傳回 `UsernameExistsException` 錯誤，並將確認代碼傳送到 Jie 的電子郵件地址。

   **範例 AWS CLI 命令**

   ```
   aws cognito-idp sign-up --client-id 1234567890abcdef0 --username shirley --password PASSWORD --user-attributes Name="email",Value="jie@example.com"
   ```

   **回應範例**

   ```
   {
       "UserConfirmed": false, 
       "UserSub": "<new subId>", 
       "CodeDeliveryDetails": {
           "AttributeName": "email", 
           "Destination": "j****@e****", 
           "DeliveryMedium": "EMAIL"
       }
   }
   ```

1. 在不同的情況下，Shirley 擁有 `jie@example.com`。Shirley 會擷取 Amazon Cognito 傳送至 Jie 電子郵件地址的代碼，並嘗試確認帳戶。

   **範例 AWS CLI 命令**

   ```
   aws cognito-idp confirm-sign-up --client-id 1234567890abcdef0 --username=shirley --confirmation-code xxxxxx
   ```

   **回應範例**

   ```
   An error occurred (AliasExistsException) when calling the ConfirmSignUp operation: An account with the email already exists.
   ```

儘管 `jie@example.com` 已指派給現有使用者，Amazon Cognito 不會對 Shirley 的 `aws cognito-idp sign-up` 請求傳回錯誤。Shirley 必須先證明電子郵件地址的擁有權，Amazon Cognito 才會傳回錯誤回應。在具有別名屬性的使用者集區中，此行為會防止使用公有 `SignUp` API 來檢查指定的電子郵件地址或電話號碼是否有使用者。

此行為與 Amazon Cognito 以現有使用者名稱傳回 `SignUp` 請求的回應不同，如下列範例所示。雖然 Shirley 從此回應中得知已經有使用者名稱為 `jie` 的使用者，但他們不會得知任何與使用者相關聯的電子郵件地址或電話號碼。

**CLI 命令範例**

```
aws cognito-idp sign-up --client-id 1example23456789 --username jie --password PASSWORD
      --user-attributes Name="email",Value="shirley@example.com"
```

**回應範例**

```
An error occurred (UsernameExistsException) when calling the SignUp operation: User already exists
```

## 密碼重設操作
<a name="cognito-user-pool-managing-errors-password-reset"></a>

當您防止使用者存在錯誤時，Amazon Cognito 會對使用者密碼重設作業傳回下列回應。

**ForgotPassword**  
當找不到使用者、使用者遭停用，或沒有經過驗證的傳遞機制可復原使用者的密碼時，Amazon Cognito 會為使用者傳回 `CodeDeliveryDetails` 以及模擬的傳遞媒介。模擬的傳遞媒體取決於使用者集區的輸入使用者名稱格式和驗證設定。

**ConfirmForgotPassword**  
Amazon Cognito 會為不存在或已停用的使用者傳回 `CodeMismatchException` 錯誤。如果使用 `ForgotPassword` 時未要求代碼，Amazon Cognito 會傳回 `ExpiredCodeException` 錯誤。

## 確認操作
<a name="cognito-user-pool-managing-errors-confirmation"></a>

當您防止使用者存在錯誤時，Amazon Cognito 會傳回以下對使用者確認和驗證作業的回應。

**ResendConfirmationCode**  
Amazon Cognito 會為已停用或不存在的使用者傳回 `CodeDeliveryDetails`。Amazon Cognito 會將確認碼傳送至現有使用者的電子郵件或電話號碼。

**ConfirmSignUp**  
 如果代碼已過期會傳回 `ExpiredCodeException`。使用者未獲授權時，Amazon Cognito 會傳回 `NotAuthorizedException`。如果代碼不符伺服器預期，Amazon Cognito 會傳回 `CodeMismatchException`。