使用自适应身份验证 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用自适应身份验证

借助自适应身份验证,可以将用户池配置为阻止可疑登录,或为响应增加的风险级别添加第二安全要素身份验证。对于每次登录尝试,Amazon Cognito 都会生成一个风险分数来表示登录请求来自遭盗用源的可能性。此风险分数基于许多因素,包括它是否检测到新设备、用户位置或 IP 地址。自适应身份验证基于风险级别为那些没有在用户级别启用 MFA 类型的用户添加 MFA。当在用户级别启用 MFA 类型时,无论您如何配置自适应身份验证,这些用户在身份验证过程中将始终收到第二个因素质询。

Amazon Cognito 将向 Amazon CloudWatch 发布登录尝试、其风险级别和失败的质询。有关更多信息,请参阅查看高级安全指标

要向用户池添加自适应身份验证,请参阅 向用户池添加高级安全

自适应身份验证概览

在 Amazon Cognito 控制台中的 Advanced security (高级安全) 页面上,您可以选择自适应身份验证的设置,包括在不同风险级别下采取什么操作,以及向用户发送的通知消息的自定义设置。

对于每个风险级别,您可以选择以下选项:

选项

操作

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

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

将用户设备和会话数据添加到 API 请求

当您使用 API 对用户进行注册、登录和重置密码时,可以收集用户会话的相关信息并将其传递给 Amazon Cognito 高级安全功能。此信息包括用户的 IP 地址和唯一的设备标识符。

您可能在用户和 Amazon Cognito 之间有中间网络设备,例如代理服务或应用程序服务器。您可以收集用户的上下文数据并将其传递给 Amazon Cognito,以便自适应身份验证根据用户端点(而不是服务器或代理)的特征来计算风险。如果您的客户端应用程序直接调用 Amazon Cognito API 操作,自适应身份验证会自动记录源 IP 地址。但是,它不会记录其他设备信息(例如 user-agent),除非您也收集设备指纹。

使用 Amazon Cognito 上下文数据收集库生成此数据,然后使用 ContextDataUserContextData 参数将它提交到 Amazon Cognito 高级安全功能。上下文数据收集库包含在 Amazon SDK 中。有关更多信息,请参阅将 Amazon Cognito 与 Web 和移动应用程序集成。如果您已在用户群体中激活了高级安全功能,则可以提交 ContextData。有关更多信息,请参阅配置高级安全功能

当您从应用程序服务器调用以下经过 Amazon Cognito 身份验证的 API 操作时,请在 ContextData 参数中传递用户设备的 IP。此外,请传递服务器名称、服务器路径和编码的设备指纹数据。

当您调用 Amazon Cognito 未经身份验证的 API 操作时,您可以将 UserContextData 提交到 Amazon Cognito 高级安全功能。此数据在 EncodedData 参数中包括设备指纹。如果您符合以下条件,也可以在 UserContextData 中提交 IpAddress 参数:

您的应用程序可以在以下 Amazon Cognito 未经验证的 API 操作中,使用编码的设备指纹数据和用户设备的 IP 地址填充 UserContextData 参数。

接受额外的用户上下文数据(Amazon 控制台)

激活 Accept additional user context data(接受其他用户上下文数据)功能后,用户群体在 UserContextData 参数中接受 IP 地址。在以下情况下,您无需激活此功能:

  • 您的用户只能使用经过身份验证的 API 操作(如 AdminInitiateAuth)进行登录,而您使用 ContextData 参数。

  • 您只希望未经身份验证的 API 操作向 Amazon Cognito 高级安全功能发送设备指纹,而不是 IP 地址。

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

  1. 登录 Amazon Cognito 控制台

  2. 在导航窗格中,选择 Manage your User Pools(管理您的用户池),然后选择要编辑的用户池。

  3. 选择 App integration(应用程序集成)选项卡。

  4. App clients and analytics(应用程序客户端和分析)下,选择或创建应用程序客户端。有关更多信息,请参阅配置用户群体应用程序客户端

  5. App client information(应用程序客户端信息)容器中选择 Edit(编辑)。

  6. 在应用程序客户端的 Advanced authentication settings(高级身份验证设置)下,选择 Accept additional user context data(接受其他用户上下文数据)。

  7. 选择保存更改

要将应用程序客户端配置为在 Amazon Cognito API 中接受用户上下文数据,请在 CreateUserPoolClientUpdateUserPoolClient 请求中将 EnablePropagateAdditionalUserContextData 设置为 true。有关从 Web 或移动应用程序激活高级安全功能的信息,请参阅从应用程序中激活用户群体高级安全功能。当您的应用程序从服务器调用 Amazon Cognito 时,从客户端收集用户上下文数据。以下是使用 JavaScript 开发工具包方法 getData 的示例。

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

在设计应用程序以使用自适应身份验证时,我们建议您将最新的 Amazon Cognito 开发工具包集成到应用程序中。最新版本的开发工具包收集设备指纹信息,如设备 ID、模型和时区。有关 Amazon Cognito SDK 的更多信息,请参阅安装用户池 SDK。Amazon Cognito 高级安全功能只为应用程序以正确格式提交的事件保存和分配风险评分。如果 Amazon Cognito 返回错误响应,请检查您的请求是否包含有效的密钥哈希值,以及 IPaddress 参数是否为有效的 IPv4 或 IPv6 地址。

查看用户事件历史记录

注意

在新的 Amazon Cognito 控制台中,您可以在 Users(用户)选项卡中查看用户事件历史记录。

要查看某个用户的登录历史记录,您可以在 Amazon Cognito 控制台的 Users and groups(用户和组)中选择该用户。Amazon Cognito 会将用户事件历史记录保留两年。


            用户事件历史记录

每个登录事件都有一个事件 ID。该事件还包含对应的上下文数据,如位置、设备详细信息和风险检测结果。您可以使用 Amazon Cognito API 操作 AdminListUserAutEvents 或者使用 Amazon Command Line Interface (Amazon CLI) 通过 admin-list-user-auth-events 来查询用户事件历史记录。

您还可以将事件 ID 与 Amazon Cognito 在记录事件时发放的令牌关联起来。ID 和访问令牌在其有效负载中包含此事件 ID。Amazon Cognito 还将刷新令牌的使用与原始事件 ID 相关联。您可以通过原始事件 ID 追溯到导致颁发 Amazon Cognito 令牌的登录事件的事件 ID。您可以跟踪系统中的令牌在特定身份验证事件中的使用。有关更多信息,请参阅将令牌与用户池结合使用

提供事件反馈

事件反馈实时影响风险评估,并随着时间的推移改进风险评估算法。您可以通过 Amazon Cognito 控制台和 API 操作提供有关登录尝试有效性的反馈。

控制台的 Users and groups(用户和组)选项卡中列出了登录历史记录。您可以选择某个条目来将事件标记为有效或无效。您还可以通过用户池 API 操作 AdminUpdateAuthEventFeedback、Amazon CLI 命令 admin-update-auth-event-feedback 提供反馈。

发送通知消息

借助高级安全保护措施,Amazon Cognito 可以通知您用户的登录尝试。Amazon Cognito 还可以提示用户选择链接以指示登录是有效还是无效。Amazon Cognito 使用此反馈来提高用户池的风险检测准确性。

Automatic risk response(自动风险响应)部分,对低、中和高风险案例选择 Notify Users(通知用户)。


            通知用户

您可以自定义通知电子邮件消息,并提供这些消息的纯文本和 HTML 版本。选择 Adaptive authentication notification messages(自适应身份验证通知消息)中的 Customize(自定义)来自定义电子邮件通知。要了解有关电子邮件模板的更多信息,请参阅 消息模板