为应用程序中的威胁防护收集数据 - Amazon Cognito

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

为应用程序中的威胁防护收集数据

Amazon Cognito 自适应身份验证根据用户登录尝试的上下文详细信息评估账户盗用尝试的风险等级。您的应用程序必须向API请求添加上下文数据,这样 Amazon Cognito 高级安全才能更准确地评估风险。上下文数据是诸如 IP 地址、浏览器代理、设备信息和请求标头之类的信息,这些信息提供有关用户如何连接到您的用户池的上下文信息。

向 Amazon Cognito 提交此上下文的应用程序的核心责任是向用户池发送身份验证请求中的一个EncodedData参数。要将这些数据添加到您的请求中,您可以实现 Amazon CognitoSDK,它会自动为您生成这些信息,也可以实现一个 JavaScript适用于 iOS 或 Android 的模块来收集这些数据。必须实现直接向 Amazon Cognito 发出请求的@@ 仅限客户端的应用程序。 AWS Amplify SDKs具有中间@@ 服务器或API组件的客户端- 服务器应用程序必须实现单独的SDK模块。

在以下情况下,您的身份验证前端无需任何其他配置即可管理用户上下文数据的收集:

  • 托管用户界面会自动收集上下文数据并将其提交给高级安全功能。

  • 所有 AWS Amplify 库的身份验证方法中都内置了上下文数据集合。

使用 Amplify 在仅限客户端的应用程序中提交用户情境数据

Amplify 应用程序中高级安全功能的数据收集概述。

Amplify SDKs 支持直接通过 Amazon Cognito 进行身份验证的移动客户端。此类客户直接向 Amazon Cognito 的公共API运营API提出请求。默认情况下,Amplify 客户端会自动收集高级安全功能的上下文数据。

带的 Amplify 应用程序是个 JavaScript 例外。它们需要添加一个用于收集用户上下文数据的JavaScript 模块

通常,此配置中的应用程序使用未经身份验证的API操作,例如InitiateAuth和。RespondToAuthChallengeUserContextData对象有助于更准确地评估这些操作的风险。Amplify SDKs 将设备和会话信息添加到的EncodedData参数中。UserContextData

在客户端-服务器应用程序中收集上下文数据

某些应用程序具有用于收集用户身份验证数据的前端层和用于向 Amazon Cognito 提交身份验证请求的应用程序后端层。这是由微服务支持的网络服务器和应用程序中的常见架构。在这些应用程序中,必须导入公共上下文数据集合库。

服务器端身份验证概述以及高级安全功能中的上下文数据。 JavaScript

通常,此配置中的应用程序服务器使用经过身份验证的API操作,例如AdminInitiateAuthAdminRespondToAuthChallenge。该ContextData对象可帮助 Amazon Cognito 更准确地评估这些操作的风险。的内容ContextData是您的前端传递给服务器的编码数据,以及用户向服务器发出的HTTP请求中的其他详细信息。这些额外的上下文详细信息(例如HTTP标头和 IP 地址)为您的应用程序服务器提供了用户环境的特征。

您的应用程序服务器也可能使用未经身份验证的API操作(如InitiateAuth和)进行登录。RespondToAuthChallengeUserContextData对象为这些操作中的高级安全风险分析提供信息。可用的公共上下文数据收集库中的操作将安全信息添加到身份验证请求中的EncodedData参数中。此外,将您的用户池配置为接受其他上下文数据,并将用户的源 IP 添加到的IpAddress参数中UserContextData

向客户端-服务器应用程序添加上下文数据
  1. 在您的前端应用程序中,使用 iO S、Android 或 JavaScript 模块从客户端收集经过编码的上下文数据。

  2. 将编码后的数据和身份验证请求的详细信息传递给您的应用程序服务器。

  3. 在您的应用程序服务器中,从请求中提取用户的 IP 地址、相关HTTP标头、请求的服务器名称和HTTP请求的路径。将这些值填充到您向 Amazon Cognit API o 提出的请求的ContextData参数中。

  4. 使用您的SDK模块收集ContextData的已编码设备数据填充API请求中的EncodedData参数。将此上下文数据添加到身份验证请求中。

客户端-服务器应用程序的上下文数据库

JavaScript

amazon-cognito-advanced-security-data.min.js模块收集EncodedData了您可以传递给应用程序服务器的内容。

将该amazon-cognito-advanced-security-data.min.js模块添加到您的 JavaScript 配置中。<region>替换为以下 AWS 区域 列表中的:us-east-1us-east-2us-west-2eu-west-1eu-west-2、或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/Swif

要生成情境数据,iOS 应用可以集成 iOS 版移动版SDK模块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

要生成上下文数据,安卓应用程序可以集成安卓手机版SDK模块 aws-android-sdk-cognitoidentityprovider-asf

要收集经过编码的上下文数据以提高安全性,请将以下代码段添加到您的应用程序中:

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