

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

# 将联合用户与现有用户配置文件关联
<a name="cognito-user-pools-identity-federation-consolidate-users"></a>

通常，同一个用户的个人资料包含多个身份提供商 (IdPs)，您已将其连接到您的用户池。Amazon Cognito 可以将用户的每次出现与目录中的同一个用户配置文件关联。这样，一个拥有多个 IdP 用户的人就可以在您的应用中获得一致的体验。 [AdminLinkProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminLinkProviderForUser.html)让 Amazon Cognito 将您的联合目录中用户的唯一 ID 识别为用户池中的用户。当您具有零个或多个与用户配置文件相关联的联合身份时，用户池中的一个用户将计为一个每月活跃用户 (MAU) 以进行[计费](https://aws.amazon.com/cognito/pricing/)。

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

**重要**  
由于`AdminLinkProviderForUser`允许具有外部联合身份的用户以用户池中的现有用户身份登录，因此必须仅将其与应用程序所有者信任的外部 IdPs 和提供者属性一起使用。

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

你的 ADFS 在 IdPs 向亚马逊 Cognito 提出的 S `msp_carlos@example.com` AML `email` 声明中出示了 Carlos 的电子邮件地址。您使用用户名 `Carlos` 在用户池中创建一个用户。以下 AWS Command Line Interface (AWS CLI) 命令将来自 IdPs ADFS1、 ADFS2和 Carlos 的身份链接起来。 ADFS3

**注意**  
您可以根据特定属性声明关联用户。这种能力是 OIDC 和 SAML 所独有的。 IdPs对于其他提供者类型，您必须基于固定来源属性来进行关联。有关更多信息，请参阅 [AdminLinkProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminLinkProviderForUser.html)。当您将社交 IdP 与用户配置文件关联时，必须将 `ProviderAttributeName` 设置为 `Cognito_Subject`。`ProviderAttributeValue` 必须是用户在 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 请求中的 `SourceUser` 的 `ProviderAttributeName` 参数的定义，您最多可以将用户链接到五个 IdP 属性声明中的每个 IdP。例如，如果您已将至少一个用户链接到源属性 `email`、`phone`、`department`、`given_name` 和 `location`，则只能选择这五个属性中的一个来链接额外的用户。
+ 您可以将联合用户与现有联合用户配置文件或本地用户关联。
+ 您无法在中将提供商链接到用户个人资料 AWS 管理控制台。
+ 您的用户 ID 令牌在 `identities` 声明中含包所有关联的提供者。
+ 您可以在 API 请求中为自动创建的联合用户配置文件设置密码。[AdminSetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html)然后，该用户的状态从 `EXTERNAL_PROVIDER` 更改为 `CONFIRMED`。处于此状态的用户能够以联合用户身份登录，并像关联的本地用户一样在 API 中启动身份验证流程。他们还可以在经过令牌验证的 API 请求中修改自己的密码和属性，例如和。[ChangePassword[UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html)](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ChangePassword.html)作为最佳安全实践，为了让用户与您的外部 IdP 保持同步，请勿在联合用户配置文件上设置密码。相反，使用 `AdminLinkProviderForUser` 将用户与本地配置文件关联。
+ 当用户通过 IdP 进行登录时，Amazon Cognito 会将用户属性填充到关联的本地用户配置文件中。Amazon Cognito 处理来自 OIDC IdP 的 ID 令牌中的身份声明，还会检查 2.0 和 OIDC 提供商`userInfo`的 OAuth终端节点。Amazon Cognito 将 ID 令牌中的信息优先级置于来自 `userInfo` 的信息之上。

当您得知用户不再使用您已关联到其个人资料的外部用户账户时，您可以取消该用户账户与您的用户池用户的关联。当您关联用户时，您会在请求中提供用户的属性名称、属性值和提供者名称。要删除用户不再需要的配置文件，请使用等效参数发出 [AdminDisableProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDisableProviderForUser.html)API 请求。

[AdminLinkProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminLinkProviderForUser.html)有关其他命令语法和示例，请参见 AWS SDKs。