

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

# 使用自適應身分驗證
<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)。