将联合用户与现有用户配置文件关联 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将联合用户与现有用户配置文件关联

通常,同一个用户拥有的配置文件具有您已连接到用户群体的多个身份提供者 (IdP)。Amazon Cognito 可以将用户的每次出现与目录中的同一个用户配置文件关联。这样,一个拥有多个 IdP 用户的人可以在您的应用程序中获得一致的体验。AdminLinkProviderForUser 告诉 Amazon Cognito 将联合目录中的用户的唯一 ID 识别为用户群体中的用户。当您具有零个或多个与用户配置文件相关联的联合身份时,用户群体中的一个用户将计为一个每月活跃用户 (MAU) 以进行计费

当联合用户首次登录您的用户群体时,Amazon Cognito 会查找您已关联到其身份的本地个人资料。如果不存在关联的个人资料,则您的用户群体会创建一个新的个人资料。您可以在联合用户首次登录前的任何时候,通过计划中的预先准备任务或 注册前 Lambda 触发器 中的 AdminLinkProviderForUser API 请求,创建本地配置文件将其链接到联合用户。在您的用户登录且 Amazon Cognito 检测到关联的本地个人资料后,您的用户群体会读取用户的声明,并将其与 IdP 的映射规则进行比较。然后,您的用户群体会使用他们登录时映射的声明来更新关联的本地个人资料。通过这种方式,您可以为本地个人资料配置访问权限声明,并向您的提供者及时更新其身份声明。在 Amazon Cognito 将您的联合用户与关联的个人资料匹配后,他们将始终登录该个人资料。然后,您可以将用户的更多提供者身份关联到同一个人资料,从而为一位客户提供一致的应用体验。要关联之前登录过的联合用户,必须先删除其现有个人资料。您可以通过其格式识别现有个人资料:[Provider name]_identifier。例如,LoginWithAmazon_amzn1.account.AFAEXAMPLE。您创建并链接到第三方用户身份的用户具有创建时使用的用户名和包含其关联身份详细信息的 identities 属性。

重要

由于 AdminLinkProviderForUser 允许具有外部联合身份的用户以用户群体中的现有用户身份进行登录,因此,至关重要的是,它只能与应用程序拥有者已信任的外部 IdP 和提供者属性一起使用。

例如,如果您是托管服务提供商 (MSP),具有一个与多个客户共享的应用程序。每个客户都通过 Active Directory Federation Services (ADFS) 登录您的应用程序。您的 IT 管理员 Carlos 在每个客户的域中都有一个账户。您希望 Carlos 在每次登录时都能被识别为应用程序管理员,而不考虑 IdP。

您的 ADFS IdP 在 Carlos 的 SAML 断言的 email 声明中向 Amazon Cognito 提供 Carlos 的电子邮件地址 msp_carlos@example.com。您使用用户名 Carlos 在用户群体中创建一个用户。以下 Amazon Command Line Interface (Amazon CLI) 命令将 Carlos 的来自 IdP ADFS1、ADFS2 和 ADFS3 的身份相关联。

注意

您可以根据特定属性声明关联用户。此功能对 OIDC 和 SAML IdP 来说是独有的。对于其他提供者类型,您必须基于固定来源属性来进行关联。有关更多信息,请参阅 AdminLinkProviderForUser。当您将社交 IdP 与用户配置文件关联时,必须将 ProviderAttributeName 设置为 Cognito_SubjectProviderAttributeValue 必须是用户在 IdP 中的唯一标识符。

aws cognito-idp admin-link-provider-for-user \ --user-pool-id us-east-1_EXAMPLE \ --destination-user ProviderAttributeValue=Carlos,ProviderName=Cognito \ --source-user ProviderName=ADFS1,ProviderAttributeName=email,ProviderAttributeValue=msp_carlos@example.com aws cognito-idp admin-link-provider-for-user \ --user-pool-id us-east-1_EXAMPLE \ --destination-user ProviderAttributeValue=Carlos,ProviderName=Cognito \ --source-user ProviderName=ADFS2,ProviderAttributeName=email,ProviderAttributeValue=msp_carlos@example.com aws cognito-idp admin-link-provider-for-user \ --user-pool-id us-east-1_EXAMPLE \ --destination-user ProviderAttributeValue=Carlos,ProviderName=Cognito \ --source-user ProviderName=ADFS3,ProviderAttributeName=email,ProviderAttributeValue=msp_carlos@example.com

用户群体中的用户配置文件 Carlos 现在具有以下 identities 属性。

[{ "userId": "msp_carlos@example.com", "providerName": "ADFS1", "providerType": "SAML", "issuer": "http://auth.example.com", "primary": false, "dateCreated": 111111111111111 }, { "userId": "msp_carlos@example.com", "providerName": "ADFS2", "providerType": "SAML", "issuer": "http://auth2.example.com", "primary": false, "dateCreated": 111111111111111 }, { "userId": "msp_carlos@example.com", "providerName": "ADFS3", "providerType": "SAML", "issuer": "http://auth3.example.com", "primary": false, "dateCreated": 111111111111111 }]
有关关联联合用户需了解的事项
  • 您最多可以将五个联合用户与每个用户配置文件关联。

  • 根据 AdminLinkProviderForUser API 请求中的 SourceUserProviderAttributeName 参数的定义,您最多可以将用户链接到五个 IdP 属性声明中的每个 IdP。例如,如果您已将至少一个用户链接到源属性 emailphonedepartmentgiven_namelocation,则只能选择这五个属性中的一个来链接额外的用户。

  • 您可以将联合用户与现有联合用户配置文件或本地用户关联。

  • 您无法在 Amazon Web Services Management Console中将提供者与用户配置文件关联。

  • 您的用户 ID 令牌在 identities 声明中含包所有关联的提供者。

  • 您可以在 AdminSetUserPassword API 请求中为自动创建的联合用户配置文件设置密码。然后,该用户的状态从 EXTERNAL_PROVIDER 更改为 CONFIRMED。处于此状态的用户能够以联合用户身份登录,并像关联的本地用户一样在 API 中启动身份验证流程。他们还可以在经过令牌身份验证的 API 请求中修改其密码和属性,如 ChangePasswordUpdateUserAttributes。作为最佳安全实践,为了让用户与您的外部 IdP 保持同步,请勿在联合用户配置文件上设置密码。相反,使用 AdminLinkProviderForUser 将用户与本地配置文件关联。

  • 当用户通过 IdP 进行登录时,Amazon Cognito 会将用户属性填充到关联的本地用户配置文件中。Amazon Cognito 处理来自 OIDC IdP 的 ID 令牌中的身份声明,还会检查 OAuth 2.0 和 OIDC 提供者的 userInfo 端点。Amazon Cognito 将 ID 令牌中的信息优先级置于来自 userInfo 的信息之上。

当您得知用户不再使用您已关联到其个人资料的外部用户账户时,您可以取消该用户账户与您的用户群体用户的关联。当您关联用户时,您会在请求中提供用户的属性名称、属性值和提供者名称。要删除用户不再需要的个人资料,请使用等效参数发出 AdminDisableProviderForUser API 请求。

有关 Amazon SDK 中的其他命令语法和示例,请参阅 AdminLinkProviderForUser