使用用户群体中的用户设备 - Amazon Cognito

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

使用用户群体中的用户设备

当您使用 Amazon Cognito 用户池登录本地用户池时API,您可以将来自高级安全功能的用户活动日志与他们的每台设备相关联,如果您的用户使用的是可信设备,也可以允许他们跳过多重身份验证 (MFA)。对于任何尚未包含设备信息的登录,Amazon Cognito 都会在响应中包含设备密钥。设备密钥的格式为 Region_UUID。借助设备密钥、安全远程密码 (SRP) 库和允许设备身份验证的用户池,您可以提示应用程序中的用户信任当前设备,而无需在登录时提示输入MFA密码。

设置记忆设备

借助 Amazon Cognito 用户群体,您可以将每个用户的设备与唯一的设备标识符(设备密钥)关联起来。当您在登录时提供设备密钥并执行设备身份验证时,您可以利用两个特征。

  1. 借助高级安全特征,您可以监控特定设备上的用户活动,以实现安全和分析目的。当用户登录时,应用程序可以选择对每个用户及其设备进行身份验证,同时将设备信息添加到其活动日志中。

  2. 记住设备还支持可信设备身份验证流程,根据应用程序的安全要求或用户的偏好,您的用户可以选择不等MFA到以后登录。例如,您的应用程序可能会提示您的用户信任某台设备 30、60 或 90 天。您可以将此日期存储在自定义属性中,并在该日期更改其设备的记忆状态。然后,您必须重新提示用户提交验证MFA码,并将设备设置为在成功进行身份验证后再次被记住。

    记住的设备MFA只能在MFA处于活动状态的用户池中进行覆盖。

当用户使用记住的设备登录时,您必须在其身份验证流程中执行额外的设备身份验证。有关更多信息,请参阅 使用设备登录

在用户群体的登录体验选项卡的设备跟踪下,将用户群体配置为记住设备。通过 Amazon Cognito 控制台设置记忆设备功能时,有三种选项供您选择:Always (始终)User Opt-In (用户选择加入)No (否)

请勿记住

用户群体不会提示用户在登录时记住设备。

始终记住

当您的应用程序确认用户的设备时,您的用户池将始终记住该设备,并且不会在将来成功登录设备时返回MFA挑战。

用户选择加入

当您的应用程序确认用户的设备时,您的用户池不会自动抑制MFA挑战。您必须提示用户选择是否要记住设备。

当您选择始终记住用户选择加入时,每次用户从身份不明的设备登录时,Amazon Cognito 都会生成设备标识符密钥和机密。设备密钥是应用程序在用户执行设备身份验证时发送到用户群体的初始标识符。

对于每个已确认的用户设备,无论是自动记住还是选择加入,您都可以在每次用户登录时使用设备标识符密钥和机密对设备进行身份验证。

您还可以在或请求中为用户池配置记忆设备设置。CreateUserPoolUpdateUserPoolAPI欲了解更多信息,请参阅该DeviceConfiguration属性。

Amazon Cognito 用户池API为记住的设备提供了其他操作。

  1. ListDevicesAdminListDevices返回用户的设备密钥及其元数据的列表。

  2. GetDeviceAdminGetDevice返回单个设备的设备密钥和元数据。

  3. UpdateDeviceStatus并将用户的设备AdminUpdateDeviceStatus设置为已记住或未记住。

  4. ForgetDevice并从用户的个人资料中AdminForgetDevice移除已确认的设备。

API名称以开头的操作Admin用于服务器端应用程序,并且必须使用IAM凭据进行授权。有关更多信息,请参阅 使用用户池API和授权服务器

获取设备密钥

每当您的用户使用用户池登录API并且身份验证参数中未包含设备密钥时DEVICE_KEY,Amazon Cognito 都会在响应中返回新的设备密钥。在公共客户端应用程序中,将设备密钥放在应用程序存储中,以便您可以将其包含在将来的请求中。在机密服务器端应用程序中,使用用户的设备密钥设置浏览器 Cookie 或其它客户端令牌。

应用程序必须确认设备密钥并提供其它信息,然后用户才能使用其可信设备登录。向 Amazon Cognito 生成ConfirmDevice请求,使用设备密钥、友好名称、密码验证器和盐来确认用户的设备。如果您将用户群体配置为选择加入设备身份验证,Amazon Cognito 会在响应您的 ConfirmDevice 请求时,提示用户必须选择是否记住当前设备。使用用户在UpdateDeviceStatus请求中的选择进行回应。

当您确认用户的设备但未将其设置为记住的设备时,Amazon Cognito 会存储关联,但在您提供设备密钥时继续进行非设备登录。设备可以生成对用户安全和故障排除非常有用的日志。已确认但未记住的设备不会利用登录特征,但会利用安全监控日志特征。当您为应用程序客户端激活高级安全特征并将设备占用空间编码到请求中时,Amazon Cognito 会将用户事件与已确认的设备关联起来。

获取新的设备密钥
  1. 通过InitiateAuthAPI请求开始用户的登录会话。

  2. 在收到标记用户登录会话完成的 JSON Web 令牌 (JWTs) RespondToAuthChallenge之前,使用回复所有身份验证挑战。

  3. 在应用程序中,记录 Amazon Cognito 在其 RespondToAuthChallengeInitiateAuth 响应的 NewDeviceMetadata 中返回的值:DeviceGroupKeyDeviceKey

  4. 为您的用户生成一个新SRP密钥:盐和密码验证器。此功能在提供SRP库SDKs的中可用。

  5. 提示用户输入设备名称,或根据用户的设备特征生成一个名称。

  6. ConfirmDeviceAPI请求中提供用户的访问令牌、设备密钥、设备名称和SRP密钥。如果用户群体设置为始终记住设备,则用户的注册已完成。

  7. 如果 Amazon Cognito 对于 ConfirmDevice 响应了 "UserConfirmationNecessary": true,请提示您的用户选择是否要记住该设备。如果他们确认要记住设备,请使用用户的访问令牌、设备密钥和生成UpdateDeviceStatusAPI请求"DeviceRememberedStatus": "remembered"

  8. 如果您已指示 Amazon Cognito 记住该设备,那么下次登录时,他们会看到的不是MFA挑战,而是挑战。DEVICE_SRP_AUTH

使用设备登录

将用户的设备配置为可记住后,Amazon Cognito 不再要求他们在使用相同的设备密钥登录时提交MFA代码。设备身份验证仅将 MFA-身份验证质询替换为设备身份验证质询。您不能仅使用设备身份验证登录用户。用户必须首先使用其密码或自定义质询完成身份验证。以下是在记住的设备上对用户进行身份验证的过程。

要在使用自定义身份验证质询 Lambda 触发器的流程中执行设备身份验证,请在InitiateAuthAPI请求中传递DEVICE_KEY参数。在用户成功完成所有质询并且 CUSTOM_CHALLENGE 质询返回的 issueTokens 值为 true 之后,Amazon Cognito 将返回一个最终 DEVICE_SRP_AUTH 质询。

使用设备登录
  1. 从客户端存储中检索用户的设备密钥。

  2. 通过InitiateAuthAPI请求开始用户的登录会话。选择一个 AuthFlowUSER_SRP_AUTHREFRESH_TOKEN_AUTHUSER_PASSWORD_AUTHCUSTOM_AUTH。在 AuthParameters 中,将用户的设备密钥添加到 DEVICE_KEY 参数中,并包括所选登录流程所需的其它参数。

    1. 您还可以在对身份验证质询的 PASSWORD_VERIFIER 响应的参数中传递 DEVICE_KEY

  3. 完成质询响应,直到您在响应中收到 DEVICE_SRP_AUTH 质询。

  4. RespondToAuthChallengeAPI请求中,发ChallengeName送、DEVICE_SRP_AUTH和的 o USERNAME f DEVICE_KEY 和参数SRP_A

  5. Amazon Cognito 以 DEVICE_PASSWORD_VERIFIER 质询进行响应。此质询响应包括 SECRET_BLOCKSRP_B 的值。

  6. 使用您的SRP库生成并提交PASSWORD_CLAIM_SIGNATUREPASSWORD_CLAIM_SECRET_BLOCKTIMESTAMPUSERNAME、和DEVICE_KEY参数。在其它 RespondToAuthChallenge 请求中提交这些内容。

  7. 完成其他挑战,直到收到用户的挑战JWTs。

以下伪代码演示如何计算 DEVICE_PASSWORD_VERIFIER 质询响应的值。

PASSWORD_CLAIM_SECRET_BLOCK = SECRET_BLOCK TIMESTAMP = Tue Sep 25 00:09:40 UTC 2018 PASSWORD_CLAIM_SIGNATURE = Base64(SHA256_HMAC(K_USER, DeviceGroupKey + DeviceKey + PASSWORD_CLAIM_SECRET_BLOCK + TIMESTAMP)) K_USER = SHA256_HASH(S_USER) S_USER = (SRP_B - k * gx)(a + ux) x = SHA256_HASH(salt + FULL_PASSWORD) u = SHA256_HASH(SRP_A + SRP_B) k = SHA256_HASH(N + g)

查看、更新和忘记设备

您可以使用 Amazon Cognito API 在您的应用程序中实现以下功能。

  1. 显示有关用户的当前设备的信息。

  2. 显示用户的所有设备的列表。

  3. 忘记设备。

  4. 更新设备记住的状态。

授权以下描述中的API请求的访问令牌必须包括aws.cognito.signin.user.admin范围。Amazon Cognito 会将此范围的声明添加到您通过 Amazon Cognito 用户池生成的所有访问令牌中。API第三方 IdPs 必须单独管理设备及其MFA向 Amazon Cognito 进行身份验证的用户。在托管 UI 中,您可以请求 aws.cognito.signin.user.admin 范围,但是托管 UI 会自动将设备信息添加到高级安全用户日志中,而不提供记住设备的功能。

显示有关设备的信息

您可以查询有关用户设备的信息,以确定设备当前是否仍在使用中。例如,您可能希望在记住的设备已有 90 天未登录后将其停用。

  • 要在公共客户端应用程序中显示用户的设备信息,请在GetDeviceAPI请求中提交用户的访问密钥和设备密钥。

  • 要在机密客户端应用程序中显示用户的设备信息,AdminGetDeviceAPI请使用 AWS 凭据签署请求并提交用户的用户名、设备密钥和用户池。

显示用户的所有设备的列表

您可以显示用户的所有设备及其属性的列表。例如,您可能要验证当前设备是否与记住的设备相匹配。

  • 在公共客户端应用程序中,在ListDevicesAPI请求中提交用户的访问令牌。

  • 在机密客户端应用程序中,使用 AWS 凭据签署AdminListDevicesAPI请求,然后提交用户的用户名和用户池。

忘记设备

您可以删除用户的设备密钥。当你确定用户不再使用设备时,或者当你检测到异常活动并想提示用户MFA再次完成操作时,你可能需要这样做。要稍后再次注册设备,必须生成并存储新的设备密钥。

  • 在公共客户端应用程序中,ForgetDeviceAPI根据请求提交用户的设备密钥和访问令牌。

  • 在机密客户端应用程序中,根据请求提交用户的设备密钥和访问令牌。AdminForgetDeviceAPI