

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

# 使用自适应身份验证
<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 向亚马逊发布了有关登录尝试、其风险等级和挑战失败的指标。 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 自适应身份验证为每个用户会话分配以下风险级别之一：**高**、**中**、**低**或**无风险**。

将**强制执行方法**从**仅限审计**更改为**全功能**时，请仔细斟酌您的选项。您对风险等级应用的自动响应会影响 Amazon Cognito 为具有相同特征的后续用户会话分配的风险等级。例如，在您选择不采取任何操作或**允许**之后，对于 Amazon Cognito 最初评估为高风险的用户会话，Amazon Cognito 会认为类似会话的风险较低。


**对于每个风险级别，您可以选择以下选项：**  

|  Option  |  Action  | 
| --- | --- | 
| 允许 | 用户无需额外安全要素即可登录。 | 
| 可选 MFA | 已配置第二安全要素的用户需要完成第二安全要素质询才能登录。用于 SMS 的电话号码和 TOTP 软件令牌是可供使用的第二个安全要素。未配置第二个因素的用户只能使用一组凭证登录。 | 
| 需要 MFA | 已配置第二安全要素的用户需要完成第二安全要素质询才能登录。Amazon Cognito 阻止未配置第二个安全要素的用户登录。 | 
| 阻止 | Amazon Cognito 阻止指定风险级别下的所有登录尝试。 | 

**注意**  
您无需验证手机号码即可将其用于 SMS 来作为第二个身份验证要素。

## 将用户设备和会话数据添加到 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 上下文数据收集库生成这些数据，然后使用和参数将其提交给 Amazon Cognito 威胁防护。[ContextData[UserContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserContextDataType.html)](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ContextDataType.html)上下文数据收集库包含在 AWS SDKs。有关更多信息，请参阅 [将 Amazon Cognito 身份验证和授权与 Web 和移动应用程序集成](cognito-integrate-apps.md)。如果您有增值版功能计划，则可以提交 `ContextData`。有关更多信息，请参阅 [设置威胁防护](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` 参数：
+ 您的用户池使用增值版功能计划。有关更多信息，请参阅 [用户池功能计划](cognito-sign-in-feature-plans.md)。
+ 您的应用程序客户端具有客户端密钥。有关更多信息，请参阅 [特定于应用程序的应用程序客户端设置](user-pool-settings-client-apps.md)。
+ 您已在应用程序客户端中激活 **接受其他用户上下文数据**。有关更多信息，请参阅 [接受额外的用户上下文数据（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>

激活**接受其他用户上下文数据**功能后，用户池在 `UserContextData` 参数中接受 IP 地址。在以下情况下，您无需激活此功能：
+ 您的用户只能使用经过身份验证的 API 操作（例如）登录 [AdminInitiateAuth ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)，并且您使用`ContextData`参数。
+ 您只希望未经身份验证的 API 操作向 Amazon Cognito 威胁防护发送设备指纹，而不是 IP 地址。

在 Amazon Cognito 控制台中按如下方式更新应用程序客户端，以添加对其他用户上下文数据的支持。

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

1. 在导航窗格中，选择 **管理您的用户池**，然后选择要编辑的用户池。

1. 选择**应用程序客户端**菜单。

1. 选择或创建一个应用程序客户端。有关更多信息，请参阅[配置用户池应用程序客户端](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html)。

1. 从**应用程序客户端信息**容器中选择**编辑**。

1. 在应用程序客户端的**高级身份验证设置**下，选择**接受其他用户上下文数据**。

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

要将您的应用程序客户端配置为接受 Amazon Cognito API 中的用户情境数据，请在[CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html)或`EnablePropagateAdditionalUserContextData`[UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html)请求`true`中设置为。有关在 Web 或移动应用程序中使用威胁防护功能的信息，请参阅[在应用程序中收集威胁防护的数据](user-pool-settings-viewing-threat-protection-app.md)。当您的应用程序从服务器调用 Amazon Cognito 时，从客户端收集用户上下文数据。以下是使用 JavaScript SDK 方法的示例`getData`。

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

在设计应用程序以使用自适应身份验证时，建议您将最新的 Amazon Cognito 开发工具包集成到应用程序中。最新版本的开发工具包收集设备指纹信息，如设备 ID、模型和时区。有关 Amazon Cognito 的更多信息 SDKs，请参阅[安装用户池软件开发](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-](https://amazon-cognito-assets.us-east-1.amazoncognito.com/amazon-cognito-advanced-security-data.min.js) 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 日志、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 会将用户事件历史记录保留两年。

![\[用户事件历史记录\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/cup-advanced-security-event-history.png)


每个登录事件都有一个事件 ID。该事件还包含对应的上下文数据，如位置、设备详细信息和风险检测结果。

您还可以将事件 ID 与 Amazon Cognito 在记录事件时颁发的令牌关联起来。ID 和访问令牌在其有效载荷中包含此事件 ID。Amazon Cognito 还将刷新令牌的使用与原始事件 ID 相关联。您可以通过原始事件 ID 追溯到导致颁发 Amazon Cognito 令牌的登录事件的事件 ID。您可以跟踪系统中的令牌在特定身份验证事件中的使用。有关更多信息，请参阅 [了解用户池 JSON 网络令牌 (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)或带有-events 的 AWS Command Line Interface (AWS CLI) 来查询用户事件历史记录。admin-list-user-auth](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-list-user-auth-events.html)

------
#### [ 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. 选择**用户池**。

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

1. 选择**日志流式传输**菜单。选择**编辑**。

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 控制台中，从**用户**菜单中选择一个用户，然后选择**提供事件反馈**。您可以查看事件详细信息，并选择**设为有效**或**设为无效**。

控制台在**用户**菜单中的“用户详细信息”中列出了登录历史记录。您可以选择某个条目来将事件标记为有效或无效。您还可以通过用户池 API 操作和 AWS CLI 命令 [admin-update-auth-event-fe [AdminUpdateAuthEventFeedback](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateAuthEventFeedback.html)edback 提供反馈](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-update-auth-event-feedback.html)。

当您在 Amazon Cognito 控制台中选择**设为有效**或在 API 中提供 `valid` 的 `FeedbackValue` 值时，您告诉 Amazon Cognito 您信任某个用户会话（Amazon Cognito 已在其中评估了某种风险等级）。当您在 Amazon Cognito 控制台中选择**设为无效**或在 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 的响应是直接拒绝登录，而不是应用自适应身份验证规则。

在**自动风险响应**部分，对低、中或高风险案例选择**通知用户**。

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


无论您的用户是否验证了电子邮件地址，Amazon Cognito 都会向他们发送电子邮件通知。

您可以自定义通知电子邮件消息，并提供这些消息的纯文本和 HTML 版本。要自定义您的电子邮件通知，请在威胁防护配置中，从**自适应身份验证消息**中打开**电子邮件模板**。要了解有关电子邮件模板的更多信息，请参阅 [消息模板](cognito-user-pool-settings-message-customizations.md#cognito-user-pool-settings-message-templates)。