

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

# SAML 身份提供者名称和标识符
<a name="cognito-user-pools-managing-saml-idp-naming"></a>

当您命名您的 SAML 身份提供商 (IdPs) 并分配 IdP 标识符时，您可以自动将 SP 发起的登录和注销请求流向该提供商。有关提供商名称的字符串约束的信息，请参阅的`ProviderName`属性[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html#CognitoUserPools-CreateIdentityProvider-request-ProviderName)。

![\[使用 IdP 标识符和托管登录的 Amazon Cognito SP 发起的 SAML 登录的身份验证流程图。用户向托管登录提供电子邮件地址，Amazon Cognito 会自动将他们重定向到其提供者。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/scenario-authentication-saml-identifier.png)


您还可以为 SAML 提供商选择最多 50 个标识符。标识符是用户池中 IdP 的友好名称，并且在用户池中必须是唯一的。如果您的 SAML 标识符与用户的电子邮件域匹配，托管登录会请求每个用户的电子邮件地址，评估其电子邮件地址中的域，然后将他们重定向到与其域对应的 IdP。由于同一个组织可以拥有多个域，因此单个 IdP 可以有多个标识符。

无论您是使用还是不使用电子邮件域标识符，您都可以在多租户应用程序中使用标识符将用户重定向到正确的 IdP。当您想完全绕过托管登录时，可以自定义向用户提供的链接，这样他们就可以通过 [对端点授权](authorization-endpoint.md) 直接重定向到他们的 IdP。要使用标识符使您的用户登录并重定向到他们的 IdP，请在其初始授权请求的请求参数中包括 `idp_identifier=myidp.example.com` 格式的标识符。

将用户传递到 IdP 的另一种方法是使用以下 URL 格式的 IdP 名称填充参数 `identity_provider`。

```
https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?
response_type=code&
identity_provider=MySAMLIdP&
client_id=1example23456789&
redirect_uri=https://www.example.com
```

用户使用您的 SAML IdP 登录后，您的 IdP 会将他们重定向到您的 `/saml2/idpresponse` 端点，并在 `HTTP POST` 正文中包括一个 SAML 响应。Amazon Cognito 会处理 SAML 断言，如果响应中的声明符合预期，则会重定向到您的应用程序客户端回调 URL。在用户以这种方式完成身份验证后，他们只与您的 IdP 和您的应用程序的网页进行交互。

使用域格式的 IdP 标识符，托管登录会在登录时请求电子邮件地址，然后，当电子邮件域与 IdP 标识符匹配时，将用户重定向到其 IdP 的登录页面。例如，您构建一个需要两家不同公司的员工登录的应用程序。第一家公司 AnyCompany A 拥有`exampleA.com`和`exampleA.co.uk`。第二家公司 AnyCompany B 拥有`exampleB.com`。在本示例中，您设置了两个 IdPs，每家公司一个，如下所示：
+ 对于 IdP A，您定义标识符 `exampleA.com` 和 `exampleA.co.uk`。
+ 对于 IdP B，您定义标识符 `exampleB.com`。

在您的应用程序中，调用应用程序客户端的托管登录，提示每位用户输入其电子邮件地址。Amazon Cognito 根据电子邮件地址得出域，将该域与具有域标识符的 IdP 关联起来，然后通过向包含 `idp_identifier` 请求参数的 [对端点授权](authorization-endpoint.md) 发出请求，将您的用户重定向到正确的 IdP。例如，如果用户输入 `bob@exampleA.co.uk`，则他们与之交互的下一个页面是位于 `https://auth.exampleA.co.uk/sso/saml` 的 IdP 登录页面。

您也可以独立实施相同的逻辑。在您的应用程序中，您可以构建一个自定义表单，用于收集用户输入并根据自己的逻辑将其与正确的 IdP 关联起来。您可为每个应用程序租户生成自定义门户，其中每个租户都通过请求参数中的租户标识符链接到授权端点。

要在托管登录中收集电子邮件地址并解析域，请为您分配给应用程序客户端的每个 SAML IdP 至少分配一个标识符。默认情况下，托管登录屏幕会针对您分配给应用程序客户端 IdPs的每个登录显示一个按钮。但如果您已成功分配标识符，则经典托管 UI 登录页面将如下图所示。

![\[Amazon Cognito 托管登录的登录页面，显示本地用户登录和要求联合用户输入电子邮件地址的提示。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/cup-saml-identifiers.png)


**注意**  
在经典托管用户界面中，当您为应用程序客户端分配标识符时，应用程序客户端的登录页面会自动提示您输入电子邮件地址。 IdPs在托管登录体验中，您必须在品牌编辑器中启用此行为。在**身份验证行为**设置类别中，在**提供商显示**标题下选择**域搜索输入**。

在托管登录中解析域时，要求使用域作为 IdP 标识符。如果您为应用程序客户端的每个 SAML IdPs 分配了任何类型的标识符，则该应用程序的托管登录将不再显示 IDP 选择按钮。当您打算使用电子邮件解析或自定义逻辑生成重定向时，请为 SAML 添加 IdP 标识符。如果您想生成静默重定向，同时希望托管登录页面显示列表，请不要分配标识符 IdPs，也不要在授权`identity_provider`请求中使用请求参数。
+ 如果您仅将一个 SAML IdP 分配给您的应用程序客户端，则托管登录的登录页面会显示一个用于使用该 IdP 登录的按钮。
+ 如果您向为应用程序客户端激活的每个 SAML IdP 分配一个标识符，则在托管登录的登录页面中会出现要求用户输入电子邮件地址的提示。
+ 如果您有多个 IdPs ，但没有为所有用户分配标识符，则托管登录页面会显示一个按钮，用于使用每个分配的 IdP 进行登录。
+ 如果您为自己分配了标识符， IdPs 并且希望托管登录页面显示精选的 IdP 按钮，请向您的应用程序客户端添加一个没有标识符的新 IdP，或者创建一个新的应用程序客户端。您也可以删除现有 IdP，然后在没有标识符的情况下重新添加它。如果您创建新的 IdP，则您的 SAML 用户将创建新的用户配置文件。活跃用户的重复计数可能会在您更改 IdP 配置的当月对账单产生影响。

有关 IdP 设置的更多信息，请参阅[为用户池配置身份提供者](cognito-user-pools-identity-provider.md)。