

# 身份提供程序和 Amazon 中的联合身份验证
<a name="id_roles_providers"></a>

作为最佳实践，建议您要求人类用户使用与身份提供商的联合身份验证访问 Amazon 资源，而不是在您的 Amazon Web Services 账户 中创建单独的 IAM 用户。利用身份提供程序 (IdP)，您可以管理 Amazon 外部的用户身份，并向这些外部用户身份授予使用您账户中的 Amazon 资源的权限。如果您的组织已有自己的身份系统（如企业用户目录），这将十分有用。如果要创建需要访问 Amazon 资源的移动应用程序或 Web 应用程序，这也十分有用。

**注意**  
您还可以使用外部 SAML 身份提供商在 [IAM Identity Center](https://docs.amazonaws.cn//singlesignon/latest/userguide/what-is.html) 中管理人类用户，而不是在 IAM 中使用 SAML 联合身份验证。IAM Identity Center 与身份提供商的联合身份验证使您能够允许人员访问组织中的多个 Amazon 账户和多个 Amazon 应用程序。要了解需要使用 IAM 用户的特定情况，请参阅 [何时创建 IAM 用户（而非角色）](https://docs.amazonaws.cn/IAM/latest/UserGuide/id.html#id_which-to-choose)。

如果您喜欢在不启用 IAM Identity Center 的情况下使用单个 Amazon 账户，则可以将 IAM 与外部 IdP 结合使用，后者会使用 [OpenID Connect（OIDC）](http://openid.net/connect/)或 [SAML 2.0（安全断言标记语言 2.0）](https://wiki.oasis-open.org/security)向 Amazon 提供身份信息。OIDC 将不在 Amazon 上运行的应用程序（例如 GitHub Actions）连接到 Amazon 资源。知名的 SAML 身份提供者的示例如 Shibboleth 和 Active Directory 联合身份验证服务。

使用身份提供商时，您不必创建自定义登录代码或管理自己的用户身份。IdP 将向您提供它们。您的外部用户通过 IdP 登录，您可以向这些外部身份授予使用您的账户中的 Amazon 资源的权限。身份提供者可帮助您确保 Amazon Web Services 账户 的安全，因为您不必再在应用程序中分配或嵌入长期安全凭证（如访问密钥）。

查看下表，以帮助确定哪种 IAM 联合身份验证类型最适合您的使用案例：IAM、IAM Identity Center 还是 Amazon Cognito。以下摘要和表格概述了您的用户可以用来获得对 Amazon 资源的联合访问权限的方法。


| IAM 联合身份验证类型 | 账户类型 | 对……的访问管理 | 支持的身份源 | 
| --- | --- | --- | --- | 
|  使用 IAM Identity Center 的联合身份验证  |  由 Amazon Organizations 管理的多个账户  |  您的人力的人类用户  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers.html)  | 
|  使用 IAM 的联合身份验证  |  单一独立账户  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers.html)  | [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers.html)  | 
|  使用 Amazon Cognito 身份池的联合身份验证  |  任何  |  需要 IAM 授权才能访问资源的应用程序的用户  | [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers.html)  | 

## 使用 IAM Identity Center 的联合身份验证
<a name="id_roles_providers_identity-center"></a>

为方便集中管理人类用户的访问权限，我们建议使用 [IAM Identity Center](https://docs.amazonaws.cn/singlesignon/latest/userguide/what-is.html) 来管理对您账户的访问以及这些账户中的权限。IAM Identity Center 中的用户将被授予对您的 Amazon 资源的长期凭证。您可以使用 Active Directory、外部身份提供者（IdP）或 IAM Identity Center 目录作为身份源，供用户和组分配对您的 Amazon 资源的访问权限。

IAM Identity Center 支持使用 SAML（安全断言标记语言）2.0 的身份联合验证，为被授权在 Amazon 访问门户中使用应用程序的用户提供联合单点登录访问权限。然后，用户可以单点登录到支持 SAML 的服务，包括 Amazon Web Services 管理控制台 和第三方应用程序（如 Microsoft 365、SAP Concur 和 Salesforce）。

## 使用 IAM 的联合身份验证
<a name="id_roles_providers_iam"></a>

虽然我们强烈建议在 IAM Identity Center 中管理人类用户，但在短期、小规模部署中，您可以通过 IAM 为人类用户启用联合主体访问权限。IAM 允许您使用单独的 SAML 2.0 和 Open ID Connect（OIDC）IdP，并使用联合主体属性进行访问控制。借助 IAM，您可以将用户属性（例如成本中心、职务或区域设置）从您的 IdP 传递给 Amazon，并根据这些属性实施精细访问权限。

*工作负载*是一系列资源和代码，它们可提供商业价值，如应用程序或后端过程。您的工作负载可能需要 IAM 身份才能向 Amazon 服务、应用程序、操作工具和组件发出请求。这些身份包括运行在您的 Amazon 环境（例如 Amazon EC2 实例或 Amazon Lambda 函数）中运行的计算机。

您还可以为需要访问权限的外部团体管理计算机身份。要为计算机身份授予访问权限，您可以使用 IAM 角色。IAM 角色具有特定的权限并可通过使用带有角色会话的临时安全凭证提供访问 Amazon 的方法。此外，您还可以拥有位于 Amazon 以外且需要访问您的 Amazon 环境的计算机。对于在 Amazon 外部运行的计算机，您可以使用 [IAM Roles Anywhere](https://docs.amazonaws.cn/rolesanywhere/latest/userguide/introduction.html)。有关角色的更多信息，请参阅 [IAM 角色](id_roles.md)。有关如何使用角色跨 Amazon Web Services 账户 委派访问权限的详情，请参阅 [IAM 教程：使用 IAM 角色委托跨 Amazon 账户的访问权限](tutorial_cross-account-with-roles.md)。

要将 IdP 直接连接到 IAM，您需要创建 IAM 身份提供者实体，以在您的 Amazon Web Services 账户 和 IdP 之间建立信任关系。IAM 支持与 [OpenID Connect (OIDC)](http://openid.net/connect/) 或者 [SAML 2.0 (Security Assertion Markup Language 2.0)](https://wiki.oasis-open.org/security) 兼容的 IdPs。有关通过 Amazon 使用这些 IdP 之一的更多信息，请参阅以下部分：
+ [OIDC 联合身份验证](id_roles_providers_oidc.md)
+ [SAML 2.0 联合身份验证](id_roles_providers_saml.md)

## 使用 Amazon Cognito 身份池的联合身份验证
<a name="id_roles_providers_cognito"></a>

Amazon Cognito 专为想要在其移动应用程序和 Web 应用程序中对用户进行身份验证和授权的开发人员而设计。Amazon Cognito 用户池为您的应用程序添加登录和注册功能，身份池提供 IAM 凭证，授予您的用户访问您在 Amazon 中管理的受保护资源的权利。身份池通过 [https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 操作获取临时会话的凭证。

Amazon Cognito 与支持 SAML 和 OpenID Connect 的外部身份提供者以及 Facebook、Google 和 Amazon 等社交身份提供者合作。您的应用程序可以使用用户群体或外部 IdP 登录用户，然后在 IAM 角色中使用自定义的临时会话代表他们检索资源。

## 其他资源
<a name="id_roles_providers_additional_resources"></a>
+ 有关如何创建自定义联合身份验证代理以使用组织的身份验证系统实现到 Amazon Web Services 管理控制台 的单点登录（SSO）的演示，请参阅 [使自定义身份凭证代理程序能够访问 Amazon 控制台](id_roles_providers_enable-console-custom-url.md)。

# 常见场景
<a name="id_federation_common_scenarios"></a>

**注意**  
我们建议您要求您的人类用户在访问 Amazon 时使用临时凭证。您是否考虑过使用 Amazon IAM Identity Center？ 您可以使用 IAM Identity Center 集中管理对多个 Amazon Web Services 账户 的访问权限，并为用户提供受 MFA 保护的单点登录访问权限，可从一个位置访问其分配的所有账户。借助 IAM Identity Center，您可以在 IAM Identity Center 中创建和管理用户身份，或者轻松连接到现有的 SAML 2.0 兼容身份提供者。有关更多信息，请参阅*《Amazon IAM Identity Center 用户指南》*中的[什么是 IAM Identity Center？](https://docs.amazonaws.cn/singlesignon/latest/userguide/what-is.html)。

您可以使用外部身份提供者（IdP）来管理 Amazon 之外的用户身份以及外部 IdP。外部 IdP 可以使用 OpenID Connect（OIDC）或安全断言标记语言（SAML）向 Amazon 提供身份信息。OIDC 通常在不在 Amazon 上运行的应用程序需要访问 Amazon 资源时使用。

如果要使用外部 IdP 配置联合身份验证，可以创建 IAM *身份提供商*，以将外部 IdP 及其配置告知 Amazon。这样将在您的 Amazon Web Services 账户和外部 IdP 之间建立信任。以下主题提供了使用 IAM 身份提供者的常见场景。

**Topics**
+ [

## 用于移动应用程序的 Amazon Cognito
](#id_roles_providers_oidc_cognito)
+ [

## 移动应用程序的 OIDC 联合身份验证
](#id_roles_providers_oidc_manual)

## 用于移动应用程序的 Amazon Cognito
<a name="id_roles_providers_oidc_cognito"></a>

使用 OIDC 联合身份验证的首选方式是使用 [Amazon Cognito](https://www.amazonaws.cn/cognito/)。例如，开发人员 Adele 正在制作一款用于移动设备的游戏，其中将分数和个人资料等用户数据存储在 Amazon S3 和 Amazon DynamoDB 中。Adele 还可将此数据存储在本地设备上，并使用 Amazon Cognito 来跨设备保持数据的同步。她知道，出于安全性和维护的原因，不应随游戏分配长期 Amazon 安全凭证。她还知道，这个游戏可能有大量用户。出于所有这些原因，她不想在 IAM 中为每个玩家都新建用户身份，而是将游戏制作成用户可使用其已通过知名的外部身份提供程序 (IdP)（如 **Login with Amazon**、**Facebook**、**Google** 或任何 **OpenID Connect** (OIDC) 兼容的 IdP）建立的身份进行登录。她的游戏可利用其中某个提供商的身份验证机制验证用户的身份。

为使该移动应用程序可访问她的 Amazon 资源，Adele 首先向她选择的 IdP 注册一个开发人员 ID。她还按其中某个提供商的要求配置该应用程序。在她的包含该游戏的 Amazon S3 存储桶和 DynamoDB 表的 Amazon Web Services 账户 中，Adele 使用 Amazon Cognito 创建了精确定义该游戏所需权限的 IAM 角色。如果她使用的是 OIDC IdP，她还可创建 IAM OIDC 身份提供商实体以在其 Amazon Web Services 账户 中的 [Amazon Cognito 身份池](https://docs.amazonaws.cn/cognito/latest/developerguide/external-identity-providers.html)和该 IdP 之间建立信任关系。

在应用程序的代码中，Adele 调用其先前配置的 IdP 的登录接口。IdP 处理让用户登录的所有详细信息，然后应用程序从提供商那里获得 OAuth 访问令牌或 OIDC ID 令牌。Adele 的应用程序可使用此身份验证信息换取一组临时安全凭证 (包括 Amazon 访问密钥 ID、私有访问密钥和会话令牌)。然后，应用程序可以使用这些凭证访问 Amazon 提供的 Web 服务。该应用程序仅获得在其担任的角色中定义的权限。

下图以 Login with Amazon 作为 IdP，展示此过程运行方式的简化流程。对于步骤 2，该应用程序还可以使用 Facebook、Google 或任何与 OIDC 兼容的 IdP，但此处不进行说明。

![\[使用 Amazon Cognito 为移动应用程序用户进行联合身份验证的示例工作流\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/images/mobile-app-web-identity-federation.diagram.png)


 

1. 客户在移动设备上启动您的应用程序。应用程序要求用户登录。

1. 应用程序使用 Login with Amazon 资源接受用户凭证。

1. 应用程序使用 Amazon Cognito API 操作 `GetId` 和 `GetCredentialsForIdentity` 将 Login with Amazon ID 令牌交换成 Amazon Cognito 令牌。Amazon Cognito 已配置为信任 Login with Amazon 项目，它会生成一个令牌，用于与 Amazon STS 交换临时会话凭证。

1. 该应用程序从 Amazon Cognito 接收临时安全凭证。您的应用程序还可使用 Amazon Cognito 中的基本（经典）工作流程，通过 `AssumeRoleWithWebIdentity` 从 Amazon STS 中检索令牌。有关更多信息，请参阅《Amazon Cognito 开发人员指南》中的[身份池（联合身份）身份验证流程](https://docs.amazonaws.cn/cognito/latest/developerguide/authentication-flow.html)。

1. 应用程序可使用临时安全凭证访问应用程序运行所需的任何 Amazon 资源。与临时安全凭证关联的角色及其分配的策略将决定可访问的资源。

使用以下过程将您的应用程序配置为使用 Amazon Cognito 对用户进行身份验证，并向您的应用程序授予对 Amazon 资源的访问权限。有关完成此操作的具体步骤，请参阅 Amazon Cognito 的相关文档。

1. （可选）使用 Login with Amazon、Facebook、Google 或任何其他与 OpenID Connect (OIDC) 兼容的 IdP 注册为开发人员，并使用这些提供商配置一个或多个应用程序。该步骤是可选的，因为 Amazon Cognito 还支持您的用户进行未经身份验证的（来宾）访问。

1. 转到 [Amazon Cognito 控制台 Amazon Web Services 管理控制台](https://console.amazonaws.cn/cognito/home)。使用 Amazon Cognito 向导创建一个身份池，身份池是一种供 Amazon Cognito 保留为您的应用程序组织的终端用户身份的容器。您可以在应用程序间共享身份池。在设置身份池时，Amazon Cognito 将创建一个或两个定义 Amazon Cognito 用户的权限的 IAM 角色（一个角色针对经过身份验证的身份，另一个角色针对未经身份验证的“来宾”身份）。

1. 将 [Amazon](https://docs.amplify.aws) Amplify 与您的应用程序集成，然后导入使用 Amazon Cognito 所需的文件。

1. 创建一个 Amazon Cognito 凭证提供程序实例，并传递身份池 ID、您的 Amazon Web Services 账户 账号，以及与身份池关联的角色的 Amazon 资源名称（ARN）。Amazon Web Services 管理控制台 中的 Amazon Cognito 向导提供了可帮助您入门的示例代码。

1. 当您的应用程序访问 Amazon 资源时，可将该凭证提供程序实例传递给客户端对象，从而将临时安全凭证传递给该客户端。证书的权限基于您之前定义的角色。

有关更多信息，请参阅下列内容：
+ Amazon Amplify 框架文档中的[登录（Android）](https://docs.amplify.aws/lib/auth/signin/q/platform/android/)。
+ Amazon Amplify 框架文档中的[登录（iOS）](https://docs.amplify.aws/lib/auth/signin/q/platform/ios/)。

## 移动应用程序的 OIDC 联合身份验证
<a name="id_roles_providers_oidc_manual"></a>

为获得最佳效果，请在几乎所有 OIDC 联合身份验证场景中将 Amazon Cognito 用作身份凭证代理程序。Amazon Cognito 易于使用，并提供了额外功能，如匿名（未经身份验证的）访问，以及跨设备和提供商同步用户数据。但是，如果您已通过手动调用 `AssumeRoleWithWebIdentity` API 创建了使用 OIDC 联合身份验证的应用程序，也可继续使用它，您的应用程序仍能正常工作。

在***不*** 使用 Amazon Cognito 的情况下使用 OIDC 联合身份验证的过程遵循此概要：

1. 以开发人员身份注册到外部身份提供程序 (IdP)，然后使用向您提供应用程序的唯一 ID 的 IdP 来配置您的应用程序。（不同的 IdP 使用不同的术语表示此过程。此概要使用*配置*一词表示通过 IdP 标识应用程序的过程。） 每个 IdP 均提供一个对于该 IdP 独一无二的应用程序 ID，因此如果按多个 IdP 的要求配置同一应用程序，则该应用程序将有多个应用程序 ID。可按每个提供商的要求配置多个应用程序。

   以下外部链接提供有关使用一些常用身份提供程序 (IdP) 的信息：
   + [Login with Amazon 开发人员中心](https://login.amazon.com/) 
   + 在 Facebook 开发人员网站上，[将 Facebook 登录名添加到您的应用程序或网站](https://developers.facebook.com/docs/facebook-login/v2.1)。
   + 在 Google 开发人员网站上，[使用 OAuth 2.0 进行登录 (OpenID Connect)](https://developers.google.com/accounts/docs/OAuth2Login)。
**重要**  
如果您使用 Google、Facebook 或 Amazon Cognito 提供的 OIDC 身份提供程序，请勿在 Amazon Web Services 管理控制台 中创建单独的 IAM 身份提供程序，Amazon 内置了这些 OIDC 身份提供程序，可供您使用。跳过以下步骤，直接使用身份提供程序创建新角色。

1. 如果您使用与 OIDC 兼容、除 Google、Facebook 或 Amazon Cognito 以外的 IdP，请为其创建 IAM 身份提供程序实体。

1. 在 IAM 中，您可以[创建一个或多个角色](id_roles_create_for-idp.md)。对于每个角色，定义谁可代入该角色（信任策略）和应用程序的用户将具有什么权限（权限策略）。通常，您为应用程序支持的每个 IdP 创建一个角色。例如，可创建一个在用户通过 Login with Amazon 登录时应用程序代入的角色，为同一应用程序再创建第二个角色，其中用户通过 Facebook 登录，然后为该应用程序创建第三个角色，其中用户通过 Google 登录。对于信任关系，指定 IdP (如 Amazon.com) 作为 `Principal` (可信实体)，并加入一个与 IdP 分配的应用程序 ID 匹配的 `Condition`。[为第三方身份提供者创建角色](id_roles_create_for-idp.md) 将介绍不同提供商的角色示例。

1. 在应用程序中，通过 IdP 验证用户身份。执行此操作的方式的详情因您所使用的 IdP (Login with Amazon、Facebook 或 Google) 和运行应用程序的平台而异。例如，Android 应用程序的身份验证方式与 iOS 应用程序或基于 JavaScript 的 Web 应用程序的不同。

   通常，如果用户尚未登录，则 IdP 负责显示登录页面。Idp 在对用户进行身份验证后，会将身份验证令牌与用户相关信息一起返回到您的应用程序。包含的信息取决于 IdP 公开的内容和用户愿意共享的信息。可在应用程序中使用这些信息。

1. 在应用程序中，对 * 操作进行*未签名 `AssumeRoleWithWebIdentity` 调用以请求临时安全凭证。在该请求中，传递 IdP 的身份验证令牌，然后指定为该 IdP 创建的 IAM 角色的 Amazon Resource Name (ARN)。Amazon 将验证令牌是否可信和有效，如果是这样，则会将临时安全凭证返回到具有从您在请求中命名的角色的权限的应用程序。响应中还包括来自 IdP 的用户相关元数据，例如，IdP 将其与用户关联的唯一用户 ID。

1. 通过使用来自 `AssumeRoleWithWebIdentity` 响应的临时安全凭证，应用程序向 Amazon API 操作发出已签名的请求。IdP 中的用户 ID 信息可以区分您的应用程序中的用户。例如，您可以将对象放入 Amazon S3 文件夹中，其包含用户 ID 作为前缀或后缀。这样可创建锁定该文件夹的访问控制策略，以使仅具有该 ID 的用户能够访问该文件夹。有关更多信息，请参阅 [Amazon STS 联合用户主体](reference_policies_elements_principal.md#sts-session-principals)。

1. 您的应用程序应缓存临时安全凭证，这样您就不需要每次在应用程序需要对 Amazon 发出请求时获取新凭证。默认情况下，证书的有效期为 1 小时。当凭证到期时 (或在此之前)，再次调用 `AssumeRoleWithWebIdentity` 以获取新的一组临时安全凭证。根据 IdP 及其管理其令牌的方式，可能必须先刷新 IdP 的令牌，然后再对 `AssumeRoleWithWebIdentity` 进行新的调用，因为 IdP 的令牌通常也在固定的一定时间后到期。如果使用的是 Amazon SDK for iOS 或 Amazon SDK for Android，则可使用 [AmazonSTSCredentialsProvider](https://www.amazonaws.cn/blogs/mobile/using-the-amazoncredentialsprovider-protocol-in-the-aws-sdk-for-ios) 操作，该操作管理 IAM 临时凭证，包括按需刷新凭证。

# OIDC 联合身份验证
<a name="id_roles_providers_oidc"></a>

假设您要创建一个访问 Amazon 资源的应用程序，例如使用工作流访问 Amazon S3 和 DynamoDB 的 GitHub Actions。

当您使用这些工作流时，将向必须使用 Amazon 访问密钥进行签名的 Amazon 服务提出请求。但是，我们**强烈**建议您**不要**将 Amazon 凭证长期存储在 Amazon 之外的应用程序中。相反，使用 *OIDC 联合身份验证*将应用程序配置为在需要时动态请求临时 Amazon 安全凭证。提供的临时凭证会映射到一个 Amazon 角色，该角色将只拥有执行该应用程序所需任务的必要权限。

借助 OIDC 联合身份验证，您不需要创建自定义登录代码或管理自己的用户身份。相反，您可以在应用程序（例如 GitHub Actions 或任何其他兼容 [OpenID Connect（OIDC）](http://openid.net/connect/)的 IdP）中使用 OIDC 进行 Amazon 身份验证。他们会接收身份验证令牌（称为 JSON Web 令牌，JWT），然后用该令牌交换 Amazon 中的临时安全凭证，这些凭证映射到有权使用您 Amazon Web Services 账户 中资源的 IAM 角色。使用 IdP 有助您确保 Amazon Web Services 账户的安全，因为您不必随应用程序嵌入和分配长期安全凭证。

OIDC 联合身份验证支持机器对机器身份验证（例如，CI/CD 管道、自动脚本和无服务器应用程序）和人工用户身份验证。对于需要管理用户注册、登录和用户个人资料的人工用户身份验证场景，可以考虑将 [Amazon Cognito](https://www.amazonaws.cn/cognito/) 用作身份凭证代理程序。有关将 Amazon Cognito 与 OIDC 结合使用的详细信息，请参阅 [用于移动应用程序的 Amazon Cognito](id_federation_common_scenarios.md#id_roles_providers_oidc_cognito)。

**注意**  
由 OpenID Connect (OIDC) 身份提供程序颁发的 JSON Web 令牌 (JWT) 在 `exp` 声明中包含指定令牌何时过期的过期时间。在 [OpenID Connect (OIDC) Core 1.0 标准](https://openid.net/specs/openid-connect-core-1_0.html)允许的情况下，IAM 在 JWT 中指定的到期时间之外提供五分钟的时段来解决时钟偏差。这意味着将接受 IAM 在到期时间后但在这五分钟内收到的 OIDC JWT 以进行进一步的评估和处理。

**Topics**
+ [

## 有关 OIDC 联合身份验证的其他资源
](#id_roles_providers_oidc_resources)
+ [

# 在 IAM 中创建 OpenID Connect（OIDC）身份提供者
](id_roles_providers_create_oidc.md)
+ [

# 获取 OpenID Connect 身份提供者的指纹
](id_roles_providers_create_oidc_verify-thumbprint.md)
+ [

# 适用于共享 OIDC 提供者的身份提供者控制
](id_roles_providers_oidc_secure-by-default.md)

## 有关 OIDC 联合身份验证的其他资源
<a name="id_roles_providers_oidc_resources"></a>

以下资源可帮助您详细了解 OIDC 联合身份验证：
+ 通过[在 Amazon Web Services 中配置 OpenID Connect](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)，从而在 GitHub 工作流中使用 OpenID Connect
+ 《适用于 Android 的 Amplify 库指南》**中的 [Amazon Cognito 身份](https://docs.amplify.aws/lib/auth/advanced/q/platform/android/)和《适用于 Swift 的 Amplify 库指南》**中的 [Amazon Cognito 身份](https://docs.amplify.aws/lib/auth/advanced/q/platform/ios/)。
+ *Amazon 安全博客*上的[授予 Amazon 资源访问权限时如何使用外部 ID](https://www.amazonaws.cn/blogs/security/how-to-use-external-id-when-granting-access-to-your-aws-resources/)提供了安全配置跨账户访问和外部身份联合验证的指导。

# 在 IAM 中创建 OpenID Connect（OIDC）身份提供者
<a name="id_roles_providers_create_oidc"></a>

*IAM OIDC 身份提供程序*是 IAM 中的实体，这些实体描述支持 [OpenID Connect](http://openid.net/connect/) (OIDC) 标准的身份提供程序 (IdP) 服务，如 Google 或 Salesforce）。当您要在与 OIDC 兼容的 IdP 和您的 Amazon Web Services 账户 之间建立信任时，请使用 IAM OIDC 身份提供程序。如果您正在创建需要访问 Amazon 资源的移动应用或 Web 应用程序，但又不想创建自定义登录代码或管理您自己的用户身份，这会很有用。有关此方案的更多信息，请参阅[OIDC 联合身份验证](id_roles_providers_oidc.md)。

您可以使用 Amazon Web Services 管理控制台、Amazon Command Line Interface、Tools for Windows PowerShell 或 IAM API 创建和管理 IAM OIDC 身份提供程序。

创建 IAM OIDC 身份提供程序后，必须创建一个或多个 IAM 角色。角色是 Amazon 中的一个实体，它没有自己的凭证（与用户一样）。但在此上下文中，角色将动态分配给由组织的 IdP 验证的 OIDC 联合主体。该角色允许组织的 IdP 请求临时安全凭证以便访问 Amazon。分配给该角色的策略决定了用户可在 Amazon 中执行的操作。要为第三方身份提供程序创建角色，请参阅 [为第三方身份提供者创建角色](id_roles_create_for-idp.md)。

**重要**  
为支持 `oidc-provider` 资源的操作配置基于身份的策略时，IAM 会评估完整的 OIDC 身份提供者 URL，包括任何指定的路径。如果 OIDC 身份提供者 URL 包含路径，则必须将该路径作为 `Resource` 元素值包含在 `oidc-provider` ARN 中。您还可以选择将正斜杠和通配符（`/*`）附加到 URL 域，或者在 URL 路径中的任何位置使用通配符（`*` 和 `?`）。如果请求中的 OIDC 身份提供者 URL 与策略中 `Resource` 元素设置的值不匹配，请求将会失败。

要解决有关 IAM OIDC 联合身份验证的常见问题，请参阅 Amazon re:Post 上的[解决与 OIDC 相关的错误](https://repost.aws/knowledge-center/iam-oidc-idp-federation)。

**Topics**
+ [

## 先决条件：验证身份提供商的配置
](#manage-oidc-provider-prerequisites)
+ [

## 创建和管理 OIDC 提供商（控制台）
](#manage-oidc-provider-console)
+ [

## 创建和管理 IAM OIDC 身份提供程序 (Amazon CLI)
](#manage-oidc-provider-cli)
+ [

## 创建和管理 OIDC 身份提供程序 (Amazon API)
](#manage-oidc-provider-api)

## 先决条件：验证身份提供商的配置
<a name="manage-oidc-provider-prerequisites"></a>

在创建 IAM OIDC 身份提供商之前，您必须从 IdP 处获得以下信息。有关获取 OIDC 提供商配置信息的更多信息，请参阅 IdP 的文档。

1. 确定您的 OIDC 身份提供商的公开可用 URL。该 URL 必须以 https:// 开头。根据 OIDC 标准，允许使用路径组件，但不允许使用查询参数。通常，该 URL 只包含一个主机名，如 https://server.example.org 或 https://example.com。URL 不应包含端口号。

1. 在 OIDC 身份提供商的 URL 末尾添加 **/.well-known/openid-configuration**，以查看该提供商的公开可用配置文档和元数据。您必须有一个 JSON 格式的发现文档，其中包含提供商的配置文档和元数据，这些文档和元数据可以从 [OpenID Connect 提供商发现端点 URL](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig) 中检索。

1. 确认以下值包含在提供商的配置信息中。如果 openid 配置缺少这些字段中的任何一个，则必须更新发现文档。此过程可能因身份提供商而异，因此请按照 IdP 文档完成此任务。
   + issuer：域的 URL。
   + jwks\$1uri：IAM 获取公钥的 JSON Web 密钥集 (JWKS) 端点。您的身份提供商必须在 openid 配置中包含一个 JSON Web 密钥集 (JWKS) 端点。此 URI 定义了从何处获取用于验证来自身份提供商的签名令牌的公钥。
**注意**  
JSON Web 密钥集 (JWKS) 必须至少包含一个密钥，最多可以有 100 个 RSA 密钥和 100 个 EC 密钥。如果 OIDC 身份提供商的 JWKS 中包含超过 100 个 RSA 密钥或 100 个 EC 密钥，则在搭配使用 [AssumeRolewithEbidentity](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 操作以及由超过 100 个密钥限制的密钥类型签名的 JWT 时，将返回 `InvalidIdentityToken` 异常。例如，如果 JWT 使用 RSA 算法进行签名，而提供商的 JWKS 中含有超过 100 个 RSA 密钥，则会返回 `InvalidIdentityToken` 异常。
   + claims\$1supported：有关用户的信息，可帮助确保来自 IdP 的 OIDC 身份验证响应包含 IAM 策略中 Amazon 用于检查 OIDC 联合主体的必需属性。有关可用于声明的 IAM 条件键的列表，请参阅 [Amazon OIDC 联合身份验证的可用键](reference_policies_iam-condition-keys.md#condition-keys-wif)。
     + aud：必须在 JSON Web 令牌 (JWT) 中确定 IdP 发布的受众声明值。受众 (aud) 声明是特定于应用程序的，用于标识令牌的预期接收者。当您向 OpenID Connect 提供商注册移动或 Web 应用时，他们会建立一个客户端 ID 来标识该应用程序。客户端 ID 是应用的唯一标识符，在 aud 声明中传递用于进行身份验证。在创建 IAM OIDC 身份提供商时，aud 声明必须与“受众”值匹配。
     + iat：声明必须包含 `iat` 的值，该值表示 ID 令牌的发布时间。
     + iss：身份提供商的 URL。URL 必须以 https:// 开头，并且应与提供给 IAM 的提供商 URL 相对应。根据 OIDC 标准，允许使用路径组件，但不允许使用查询参数。通常，该 URL 只包含一个主机名，如 https://server.example.org 或 https://example.com。URL 不应包含端口号。
   + response\$1types\$1supported：id\$1token
   + subject\$1types\$1supported：public
   + id\$1tokeninging\$1alg\$1values\$1suirted：RS256、RS384、RS512、ES256、ES384、ES512
**注意**  
可以在下面的示例中包括其他声明，如 `my_custom_claim`；但是，Amazon STS 将忽略该声明。  

   ```
   {
     "issuer": "https://example-domain.com",
     "jwks_uri": "https://example-domain.com/jwks/keys",
     "claims_supported": [
       "aud",
       "iat",
       "iss",
       "name",
       "sub",
       "my_custom_claim"
     ],
     "response_types_supported": [
       "id_token"
     ],
     "id_token_signing_alg_values_supported": [
       "RS256",
       "RS384",
       "RS512",
       "ES256",
       "ES384",
       "ES512"
     ],
     "subject_types_supported": [
       "public"
     ]
   }
   ```

## 创建和管理 OIDC 提供商（控制台）
<a name="manage-oidc-provider-console"></a>

按照以下说明在 Amazon Web Services 管理控制台 中创建和管理 IAM OIDC 身份提供程序。

**重要**  
如果您使用的是 Google、Facebook 或 Amazon Cognito 的 OIDC 身份提供程序，请勿使用此过程创建单独的 IAM 身份提供程序。这些 OIDC 身份提供程序已经内置到 Amazon，并可供您使用。相反，请按照以下步骤为身份提供程序创建新角色，请参阅 [创建用于 OpenID Connect 联合身份验证（控制台）的角色](id_roles_create_for-idp_oidc.md)。

**创建 IAM OIDC 身份提供程序（控制台）**

1. <a name="idpoidcstep1"></a>在创建 IAM OIDC 身份提供程序之前，您必须向 IdP 注册您的应用程序以便接收*客户端 ID*。客户端 ID（也称为*受众*）是您的应用的唯一标识符，在您向 IdP 注册您的应用时颁发给您。有关如何获取客户端 ID 的更多信息，请参阅您的 IdP 的文档。
**注意**  
Amazon 使用我们的受信任根证书颁发机构（CA）库来保护与 OIDC 身份提供者（IdP）之间的通信，从而验证JSON Web 密钥集（JWKS）端点的 TLS 证书。如果您的 OIDC IdP 依赖的证书不是由其中某个受信任的 CA 签名，则仅在此时我们会使用 IdP 配置中设置的指纹来保护通信。如果我们无法检索 TLS 证书或需要 TLS v1.3，则 Amazon 将回退到指纹验证。

1. 通过 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择 **Identity providers**（身份提供程序），然后选择 **Add provider**（添加提供商）。

1. 对于 **Configure provider**（配置提供商），选择 **OpenID Connect**。

1. 对于 **Provider URL**，键入 IdP 的 URL。该 URL 必须遵从以下限制：
   + 该 URL 区分大小写。
   + URL 必须以 **https://** 开头。
   + URL 不应包含端口号。
   + 在您的 Amazon Web Services 账户 中，每个 IAM OIDC 身份提供程序都必须有唯一的 URL。如果尝试提交的 URL 已用于 Amazon Web Services 账户 中的 OpenID Connect 提供商，则会出现错误。

1. 对于 **Audience**，键入您向 IdP 注册的、在[Step 1](#idpoidcstep1) 中接收的并且将向 Amazon 发出请求的应用程序的客户端 ID。如果您对于此 IdP 有其他客户端 ID（也称为*受众*），稍后可以在提供商详细信息页面上添加它们。
**注意**  
如果 IdP JWT 令牌包含 `azp` 声明，请输入此值作为“受众”值。  
如果您的 OIDC 身份提供商在令牌中同时设置 `aud` 和 `azp` 声明，则 Amazon STS 将使用 `azp` 声明中的值作为 `aud` 声明。

1. （可选）对于 **Add tags** (添加标签)，您可以添加键值对来帮助识别和组织您的 IdP。您还可以使用标签来控制对 Amazon 资源的访问。要了解有关标记 IAM OIDC 身份提供程序的更多信息，请参阅 [标记 OpenID Connect（OIDC）身份提供者](id_tags_oidc.md)。选择 **Add tag（添加标签）**。为每个标签键值对输入值。

1. 验证您提供的信息。完成此操作后，选择 **Add provider**（添加提供商）。IAM 将尝试检索并使用 OIDC IdP 服务器证书的顶级中间 CA 指纹来创建 IAM OIDC 身份提供者。
**注意**  
OIDC 身份提供者的证书链必须以域或颁发者 URL 开始，然后是中间证书，最后是根证书。如果证书链顺序不同或者包含重复证书或其他证书，则您会收到签名不匹配错误，并且 STS 无法验证 JSON Web 令牌 (JWT)。更正服务器返回的链中证书的顺序以解决错误。有关证书链标准的更多信息，请参阅 RFC Series 网站上的 [RFC 5246 中的 certificate\$1list](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.2)。

1. 将 IAM 角色分配至身份提供程序，以向身份提供程序管理的外部用户身份授予访问账户中的 Amazon 资源的权限。要了解有关为联合身份创建角色的更多信息，请参阅 [为第三方身份提供者创建角色](id_roles_create_for-idp.md)
**注意**  
角色信任策略中使用的 OIDC IdP 必须与信任它的角色位于同一账户中。

**为 IAM OIDC 身份提供程序添加或删除指纹（控制台）**
**注意**  
Amazon 使用我们的受信任根证书颁发机构（CA）库来保护与 OIDC 身份提供者（IdP）之间的通信，从而验证JSON Web 密钥集（JWKS）端点的 TLS 证书。如果您的 OIDC IdP 依赖的证书不是由其中某个受信任的 CA 签名，则仅在此时我们会使用 IdP 配置中设置的指纹来保护通信。如果我们无法检索 TLS 证书或需要 TLS v1.3，则 Amazon 将回退到指纹验证。

1. 通过 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择 **Identity providers**（身份提供程序）。然后选择要更新的 IAM 身份提供程序的名称。

1. 选择**端点验证**选项卡，然后在**指纹**部分中选择**管理**。要输入新的指纹值，请选择 **Add thumbprint**（添加指纹）。要删除指纹，请选择您要删除的指纹旁边的 **Remove**（删除）。
**注意**  
IAM OIDC 身份提供程序必须具有至少 1 个、最多 5 个指纹。

    完成后，选择 **Save changes**（保存更改）。

**为 IAM OIDC 身份提供程序添加受众（控制台）**

1. 在导航窗格中，选择 **Identity providers**（身份提供程序），然后选择要更新的 IAM 身份提供程序的名称。

1. 在 **Audiences**（受众）部分，选择 **Actions**（操作），然后选择 **Add audience**（添加受众）。

1. 键入您向 IdP 注册的、在 [Step 1](#idpoidcstep1) 中接收的并且将向 Amazon 发出请求的应用程序的客户端 ID。然后选择 **Add audiences**（添加受众）。
**注意**  
IAM OIDC 身份提供程序必须具有至少 1 个且最多 100 个受众。

**为 IAM OIDC 身份提供程序删除受众（控制台）**

1. 在导航窗格中，选择 **Identity providers**（身份提供程序），然后选择要更新的 IAM 身份提供程序的名称。

1. 在 **Audiences**（受众）部分，选择要删除的受众旁边的单选按钮，然后选择 **Actions**（操作）。

1.  选择 **Remove audience**（删除受众）。此时会打开一个新窗口。

1. 如果删除受众，受众的联合身份将无法代入与受众关联的角色。在窗口中，阅读警告并通过在字段中键入 `remove` 一词以确认删除受众。

1. 选择 **Remove**（删除）以删除受众。

**删除 IAM OIDC 身份提供程序（控制台）**

1. 通过 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择 **Identity providers**（身份提供程序）。

1. 选中要删除的 IAM 身份提供者旁边的复选框。此时会打开一个新窗口。

1. 通过在字段中键入 `delete` 一词以确认您要删除此提供商。然后选择 **Delete**(删除)。

## 创建和管理 IAM OIDC 身份提供程序 (Amazon CLI)
<a name="manage-oidc-provider-cli"></a>

可以使用以下 Amazon CLI 命令来创建和管理 IAM OIDC 身份提供程序。

**创建 IAM OIDC 身份提供程序 (Amazon CLI)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html](https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html)

1. 要创建新的 IAM OIDC 身份提供程序，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/create-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/create-open-id-connect-provider.html)

**更新现有 IAM OIDC 身份提供程序的服务器证书指纹列表 (Amazon CLI)**
+ 要更新 IAM OIDC 身份提供程序的服务器证书指纹列表，请运行以下命令：
  + [https://docs.amazonaws.cn/cli/latest/reference/iam/update-open-id-connect-provider-thumbprint.html](https://docs.amazonaws.cn/cli/latest/reference/iam/update-open-id-connect-provider-thumbprint.html)

**要标记现有 IAM OIDC 身份提供程序 (Amazon CLI)**
+ 要标记现有 IAM OIDC 身份提供程序，请运行以下命令：
  + [https://docs.amazonaws.cn/cli/latest/reference/iam/tag-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/tag-open-id-connect-provider.html)

**要列出现有 IAM OIDC 身份提供程序 (Amazon CLI) 的标签**
+ 要列出现有 IAM OIDC 身份提供程序的标签，请运行以下命令：
  + [https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-provider-tags.html](https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-provider-tags.html)

**要删除 IAM OIDC 身份提供程序 (Amazon CLI) 的标签**
+ 要删除现有 IAM OIDC 身份提供程序的标签，请运行以下命令：
  + [https://docs.amazonaws.cn/cli/latest/reference/iam/untag-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/untag-open-id-connect-provider.html)

**在现有 IAM OIDC 提供商中添加或删除客户端 ID (Amazon CLI)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html](https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html)

1. （可选）要获取有关 IAM OIDC 身份提供程序的详细信息，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/get-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/get-open-id-connect-provider.html)

1. 要向现有 IAM OIDC 身份提供程序中添加新的客户端 ID，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/add-client-id-to-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/add-client-id-to-open-id-connect-provider.html)

1. 要从现有 IAM OIDC 身份提供程序中删除客户端，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/remove-client-id-from-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/remove-client-id-from-open-id-connect-provider.html)

**删除 IAM OIDC 身份提供程序 (Amazon CLI)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html](https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html)

1. （可选）要获取有关 IAM OIDC 身份提供程序的详细信息，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/get-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/get-open-id-connect-provider.html)

1. 要删除 IAM OIDC 身份提供程序，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/delete-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/delete-open-id-connect-provider.html)

## 创建和管理 OIDC 身份提供程序 (Amazon API)
<a name="manage-oidc-provider-api"></a>

可以使用以下 IAM API 命令来创建和管理 OIDC 提供商。

**创建 IAM OIDC 身份提供程序 (Amazon API)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html)

1. 要创建新的 IAM OIDC 身份提供程序，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html)

**更新现有 IAM OIDC 身份提供程序的服务器证书指纹列表 (Amazon API)**
+ 要更新 IAM OIDC 身份提供程序的服务器证书指纹列表，请调用以下操作：
  + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_UpdateOpenIDConnectProviderThumbprint.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_UpdateOpenIDConnectProviderThumbprint.html)

**要标记现有 IAM OIDC 身份提供程序 (Amazon API)**
+ 要标记现有 IAM OIDC 身份提供程序，请调用以下操作：
  + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_TagOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_TagOpenIDConnectProvider.html)

**要列出现有 IAM OIDC 身份提供程序 (Amazon API) 的标签**
+ 要列出现有 IAM OIDC 身份提供程序的标签，请调用以下操作：
  + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviderTags.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviderTags.html)

**要删除现有 IAM OIDC 身份提供程序 (Amazon API) 的标签**
+ 要删除现有 IAM OIDC 身份提供程序的标签，请调用以下操作：
  + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_UntagOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_UntagOpenIDConnectProvider.html)

**在现有 IAM OIDC 提供商中添加或删除客户端 ID (Amazon API)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html)

1. （可选）要获取有关 IAM OIDC 身份提供程序的详细信息，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html)

1. 要向现有 IAM OIDC 身份提供程序中添加新的客户端 ID，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_AddClientIDToOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_AddClientIDToOpenIDConnectProvider.html)

1. 要从现有 IAM OIDC 身份提供程序中删除客户端 ID，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_RemoveClientIDFromOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_RemoveClientIDFromOpenIDConnectProvider.html)

**删除 IAM OIDC 身份提供程序 (Amazon API)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html)

1. （可选）要获取有关 IAM OIDC 身份提供程序的详细信息，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html)

1. 要删除 IAM OIDC 身份提供程序，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_DeleteOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_DeleteOpenIDConnectProvider.html)

# 获取 OpenID Connect 身份提供者的指纹
<a name="id_roles_providers_create_oidc_verify-thumbprint"></a>

在 IAM 中[创建 OpenID Connect（OIDC）身份提供商](id_roles_providers_create_oidc.md)时，IAM 需要对外部身份提供者（IdP）使用的证书进行签名的顶级中间证书颁发机构（CA）的指纹。该指纹是用于为 OIDC 兼容 IdP 颁发证书的 CA 证书的签名。在创建 IAM OIDC 身份提供程序时，您信任该 IdP 验证的身份有权访问您的 Amazon Web Services 账户。通过使用 CA 的证书指纹，您信任该 CA 颁发的任何证书，并且其 DNS 名称与注册的名称相同。这样，在续订 IdP 的签名证书时，无需在每个账户中更新信任关系。

**重要**  
在大多数情况下，联合身份验证服务器使用两个不同的证书：  
第一个证书将在 Amazon 与您的 IdP 之间建立 HTTPS 连接。这应由已知公有根 CA（如 Amazon Certificate Manager）发布。这使客户端能够检查证书的可靠性和状态。
第二个证书将用于加密令牌，且应由私有或公有*根* CA 签署。

您可以使用 [Amazon Command Line Interface、Tools for Windows PowerShell 或 IAM API](id_roles_providers_create_oidc.md#manage-oidc-provider-cli) 创建一个 IAM OIDC 身份提供程序。使用这些方法时，您可以选择手动提供指纹。如果您选择不包含指纹，IAM 将检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。如果您选择包含指纹，则必须手动获取指纹并将它提供给 Amazon。

当您使用 [IAM 控制台](id_roles_providers_create_oidc.md)创建 OIDC 身份提供者时，IAM 会尝试为您检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。

此外，建议您手动获取 OIDC IdP 的指纹，并验证 IAM 是否检索了正确的指纹。有关获取证书指纹的更多信息，请参阅以下部分：

**注意**  
Amazon 使用我们的受信任根证书颁发机构（CA）库来保护与 OIDC 身份提供者（IdP）之间的通信，从而验证JSON Web 密钥集（JWKS）端点的 TLS 证书。如果您的 OIDC IdP 依赖的证书不是由其中某个受信任的 CA 签名，则仅在此时我们会使用 IdP 配置中设置的指纹来保护通信。如果我们无法检索 TLS 证书或需要 TLS v1.3，则 Amazon 将回退到指纹验证。

## 获取证书指纹
<a name="oidc-obtain-thumbprint"></a>

您可以使用 Web 浏览器和 OpenSSL 命令行工具获取 OIDC 提供者的证书指纹。但是，您无需手动获取证书指纹即可创建 IAM OIDC 身份提供者。您可以使用以下过程获取 OIDC 提供者。

**获取 OIDC IdP 的指纹**

1. 您需要先获取 OpenSSL 命令行工具，然后才能获取 OIDC IdP 的指纹。您可使用此工具下载 OIDC IdP 的证书链并生成证书链中最终证书的指纹。如果需要安装和配置 OpenSSL，请遵循[安装 OpenSSL](#oidc-install-openssl) 和[配置 OpenSSL](#oidc-configure-openssl) 中的说明。

1. 从 OIDC IdP 的 URL 开始（例如，`https://server.example.com`），然后添加 `/.well-known/openid-configuration` 以构成该 IdP 的配置文档的 URL，如下所示：

   **https://*server.example.com*/.well-known/openid-configuration**

   在 Web 浏览器中打开此 URL，将 *server.example.com* 替换为 IdP 的服务器名称。

1. <a name="thumbstep2"></a>在显示的文档中，使用 Web 浏览器 **Find**（查找）功能来定位文本 `"jwks_uri"`。`"jwks_uri"` 文本后面会跟有一个冒号 (:)，然后是一个 URL。复制 URL 的完全限定域名。不包括 `https://` 或在顶级域后的任何路径。

   ```
   {
    "issuer": "https://accounts.example.com",
    "authorization_endpoint": "https://accounts.example.com/o/oauth2/v2/auth",
    "device_authorization_endpoint": "https://oauth2.exampleapis.com/device/code",
    "token_endpoint": "https://oauth2.exampleapis.com/token",
    "userinfo_endpoint": "https://openidconnect.exampleapis.com/v1/userinfo",
    "revocation_endpoint": "https://oauth2.exampleapis.com/revoke",
    "jwks_uri": "https://www.exampleapis.com/oauth2/v3/certs",
   ...
   ```

1. 使用 OpenSSL 命令行工具可运行以下命令。将 *keys.example.com* 替换为您在[Step 3](#thumbstep2) 中获取的域名。

   ```
   openssl s_client -servername keys.example.com -showcerts -connect keys.example.com:443
   ```

1. 在命令窗口中向上滚动，直至看到类似于以下示例的证书。如果您查看多个证书，请找到显示的最后一个证书（在命令输出底部）。这包含证书颁发机构链中的顶级中间的 CA 的证书。

   ```
   -----BEGIN CERTIFICATE-----
    MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
    VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
    b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
    BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
    MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
    VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
    b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
    YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
    21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
    rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
    Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
    nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
    FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
    NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=
    -----END CERTIFICATE-----
   ```

   复制证书（包括 `-----BEGIN CERTIFICATE-----` 和 `-----END CERTIFICATE-----` 行）并将其粘贴到文本文件中。然后使用文件名 **certificate.crt** 保存该文件。
**注意**  
OIDC 身份提供者的证书链必须以域或颁发者 URL 开始，包含任何中间证书（如果有），然后以根证书结尾。如果证书链顺序不同或者包含重复证书或其他证书，您将收到签名不匹配错误，并且 STS 无法验证 JSON Web 令牌（JWT）。更正服务器返回的链中证书的顺序以解决错误。有关证书链标准的更多信息，请参阅 RFC Series 网站上的 [RFC 5246 中的 certificate\$1list](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.2)。

1. 使用 OpenSSL 命令行工具可运行以下命令。

   ```
   openssl x509 -in certificate.crt -fingerprint -sha1 -noout
   ```

   您的命令窗口将显示类似于以下示例的证书指纹：

   ```
   SHA1 Fingerprint=99:0F:41:93:97:2F:2B:EC:F1:2D:DE:DA:52:37:F9:C9:52:F2:0D:9E
   ```

   请从此字符串中去掉冒号 (:) 字符以生成最终指纹，如：

   ```
   990F4193972F2BECF12DDEDA5237F9C952F20D9E
   ```

1. 如果要使用 Amazon CLI、Tools for Windows PowerShell 或 IAM API 创建 IAM OIDC 身份提供者，则提供指纹是可选的。如果您选择在创建过程中不包含指纹，IAM 将检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。创建 IAM OIDC 身份提供者后，您可以将此指纹与 IAM 检索到的指纹进行比较。

   如果您在 IAM 控制台中创建 IAM OIDC 身份提供者，则控制台会尝试为您检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。您可以将此指纹与 IAM 检索到的指纹进行比较。创建 IAM OIDC 身份提供者后，您可以在 OIDC 提供者**摘要**控制台页面的**端点验证**选项卡中查看IAM OIDC 身份提供者的指纹。
**重要**  
如果您获得的指纹与您在 IAM OIDC 身份提供者指纹详细信息中看到的指纹不匹配，则不应使用 OIDC 提供者。相反，您应该删除已创建的 OIDC 提供者，然后在一段时间后再次尝试创建 OIDC 提供者。在使用提供者之前，请验证指纹是否匹配。如果第二次尝试后指纹仍然不匹配，请使用 [IAM 论坛](https://forums.aws.csdn.net/forum.jspa?forumID=76)联系 Amazon。

## 安装 OpenSSL
<a name="oidc-install-openssl"></a>

如果您没有安装 OpenSSL，请按照本部分中的说明执行操作。

**在 Linux 或 Unix 系统上安装 OpenSSL**

1. 转到 [OpenSSL：源、Tarball](https://openssl.org/source/) (https://openssl.org/source/)。

1. 下载最新源并构建包。

**如要在 Windows 系统上安装 OpenSSL**

1. 转到 [OpenSSL：二进制分布](https://wiki.openssl.org/index.php/Binaries) (https://wiki.openssl.org/index.php/Binaries)，了解您可以从中安装 Windows 版本的站点列表。

1. 按照所选站点上的说明开始安装。

1. 如果系统要求您安装 **Microsoft Visual C\$1\$1 2008 Redistributables** 并且该程序尚未安装在您的系统上，请选择适合您环境的下载链接。按照 **Microsoft Visual C\$1\$1 2008 Redistributable 安装向导**中的说明操作。
**注意**  
如果您不确定您的系统上是否已安装 Microsoft Visual C\$1\$1 2008 Redistributables，则可以尝试先安装 OpenSSL。如果尚未安装 Microsoft Visual C\$1\$1 2008 Redistributables，OpenSSL 安装程序将显示提示。请确保安装与您安装的 OpenSSL 版本匹配的体系架构（32 位或 64 位）。

1. 在安装 Microsoft Visual C\$1\$1 2008 Redistributables 后，为您的环境选择适当的 OpenSSL 二进制版本，然后在本地保存该文件。启动 **OpenSSL 设置向导**。

1. 按照 **OpenSSL 设置向导**中的说明进行操作。

## 配置 OpenSSL
<a name="oidc-configure-openssl"></a>

在使用 OpenSSL 命令之前，您必须配置操作系统，使其具有有关 OpenSSL 安装位置的信息。

**要在 Linux 或 Unix 上配置 OpenSSL**

1. 在命令行中，将 `OpenSSL_HOME` 变量设置为 OpenSSL 安装的位置：

   ```
   $ export OpenSSL_HOME=path_to_your_OpenSSL_installation
   ```

1. 设置包含 OpenSSL 安装的路径：

   ```
   $ export PATH=$PATH:$OpenSSL_HOME/bin
   ```
**注意**  
通过使用 `export` 命令行对环境变量所做的任何更改只对当前的会话有效。通过在 shell 配置文件中设置环境变量，可对环境变量进行持续更改。有关更多信息，请参阅您的操作系统文档。

**要在 Windows 上配置 OpenSSL**

1. 打开 **Command Prompt**（命令提示符窗口）。

1. 将 `OpenSSL_HOME` 变量设置为 OpenSSL 安装的位置：

   ```
   C:\> set OpenSSL_HOME=path_to_your_OpenSSL_installation
   ```

1. 将 `OpenSSL_CONF` 变量设置为 OpenSSL 安装中配置文件的位置：

   ```
   C:\> set OpenSSL_CONF=path_to_your_OpenSSL_installation\bin\openssl.cfg
   ```

1. 设置包含 OpenSSL 安装的路径：

   ```
   C:\> set Path=%Path%;%OpenSSL_HOME%\bin
   ```
**注意**  
通过 **Command Prompt**（命令提示符）对 Windows 环境变量所做的任何更改只对当前的命令行会话有效。您可以通过将环境变量设置为系统属性来对其进行持久性更改。确切的流程取决于您使用的 Windows 版本。（例如，在 Windows 7 中，打开 **Control Panel**（控制面板）、**System and Security**（系统和安全性）、**System**（系统）。然后选择 **Advanced system settings**（高级系统设置）、**Advanced**（高级）选项卡，**Environment Variables**（环境变量）。） 有关更多信息，请参阅 Windows 文档。

# 适用于共享 OIDC 提供者的身份提供者控制
<a name="id_roles_providers_oidc_secure-by-default"></a>

对于公认的共享 OpenID Connect（OIDC）身份提供者（IdP），IAM 要求对角色信任策略中的特定声明进行明确评估。这些必需的声明名为*身份提供者控制*，由 IAM 在角色创建和信任策略更新期间进行评估。如果角色信任策略未对共享 OIDC IdP 所需的控制进行评估，则角色创建或更新将失败。这样可以确保，只有预期组织的授权身份才能代入角色和访问 Amazon 资源。这种安全控制在多个 Amazon 客户共享 OIDC 提供者时至关重要。



IAM 不会针对现有 OIDC 角色信任策略对身份提供者控制进行评估。对于针对现有 OIDC 角色的角色信任策略所进行的任何修改，IAM 将要求在角色信任策略中包含身份提供者控制。

## OIDC 提供者类型
<a name="id_roles_providers_oidc_idp_types"></a>

IAM 将 OIDC 身份提供者分为两种不同的类型：**私有**和**共享**。私有 OIDC IdP 可以由单个组织拥有和管理，也可以是 SaaS 提供商的租户，其 OIDC 颁发者 URL 是该组织特有的唯一标识符。相比之下，多个组织使用共享的 OIDC IdP，其中使用该共享身份提供者的所有组织的 OIDC 颁发者 URL 可能相同。

下表概述了私有和共享 OIDC 提供者之间的主要区别：


| 特征 | 私有 OIDC 提供者 | 共有 OIDC 提供者 | 
| --- | --- | --- | 
|  Issuer  |  归组织独有  |  在多个组织之间共享  | 
|  租赁信息  |  通过唯一的颁发者进行沟通  |  通过 JWT 中的声明进行沟通  | 
|  信任策略要求  |  无需进行特定的声明评估  |  需要对特定声明进行评估  | 

## 具有身份提供者控制的共享 OIDC 身份提供者
<a name="id_roles_providers_oidc_idp_shared_oidc_secure_support"></a>

当您在 IAM 中创建或修改 OIDC 提供者时，系统会自动识别和评估公认的共享 OIDC 提供者所需的声明。如果未在角色信任策略中配置身份提供者控制，则角色创建或更新将失败，并出现 MalformedPolicyDocument 错误。

下表列出了在角色信任策略中需要身份提供者控制的共享 OIDC 提供者以及可帮助您配置身份提供者控制的其他信息。


| OIDC IdP | OIDC URL | 租赁声明 | 所需声明 | 
| --- | --- | --- | --- | 
| [Amazon Cognito](https://docs.amazonaws.cn/cognito/latest/developerguide/iam-roles.html) |  `cognito-identity.cn-north-1.amazonaws.com.cn`  | aud |  `cognito-identity.cn-north-1.amazonaws.com.cn:aud`  | 
| [Azure Sentinel](https://learn.microsoft.com/en-us/azure/defender-for-cloud/sentinel-connected-aws) |  https://sts.windows.net/33e01921-4d64-4f8c-a055-5bdaffd5e33d  |  sts:RoleSessionName  |  sts:RoleSessionName  | 
| [Buildkite](https://buildkite.com/docs/pipelines/security/oidc/aws) |  https://agent.buildkite.com  |  sub  |  agent.buildkite.com:sub  | 
| [Codefresh SaaS](https://codefresh.io/docs/docs/integrations/oidc-pipelines/) | https://oidc.codefresh.io | sub |  oidc.codefresh.io:sub  | 
| [DVC Studio](https://dvc.org/doc/studio/user-guide/openid-connect) | https://studio.datachain.ai/api | sub |  studio.datachain.ai/api:sub  | 
| [GitHub 操作](https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services) | https://token.actions.githubusercontent.com | sub |  token.actions.githubusercontent.com:sub  | 
| [GitHub 审核日志流式传输](https://docs.github.com/en/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise) | https://oidc-configuration.audit-log.githubusercontent.com | sub |  oidc-configuration.audit-log.githubusercontent.com:sub  | 
| [GitHub vstoken](https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services) | https://vstoken.actions.githubusercontent.com | sub |  vstoken.actions.githubusercontent.com:sub  | 
| [GitLab](https://docs.gitlab.com/ci/cloud_services/aws/) | https://gitlab.com | sub |  gitlab.com:sub  | 
| [IBM Turbonomic SaaS\$1](https://www.ibm.com/docs/en/tarm/8.16.x?topic=turbonomic-setting-up-aws-iam-role-saas-deployments) |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers_oidc_secure-by-default.html)  | sub |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers_oidc_secure-by-default.html)  | 
| [Pulumi Cloud](https://www.pulumi.com/docs/pulumi-cloud/deployments/oidc/aws/) | https://api.pulumi.com/oidc | aud |  api.pulumi.com/oidc:aud  | 
| [sandboxes.cloud](https://docs.sandboxes.cloud/docs/cloud-resources-setup) | https://sandboxes.cloud | aud |  sandboxes.cloud:aud  | 
| [Scalr](https://docs.scalr.io/docs/aws) | https://scalr.io | sub |  scalr.io:sub  | 
| [Shisho Cloud](https://shisho.dev/docs/g/getting-started/integrate-apps/aws/) | https://tokens.cloud.shisho.dev | sub |  tokens.cloud.shisho.dev:sub  | 
| [Terraform Cloud](https://developer.hashicorp.com/terraform/cloud-docs/workspaces/dynamic-provider-credentials/aws-configuration) | https://app.terraform.io | sub |  app.terraform.io:sub  | 
| [Upbound](https://docs.upbound.io/providers/provider-aws/authentication/) | https://proidc.upbound.io | sub |  proidc.upbound.io:sub  | 
| [Vercel 全局端点](https://vercel.com/docs/oidc/reference) | https://oidc.vercel.com | aud |  oidc.vercel.com:aud  | 

\$1 IBM Turbonomic 定期使用该平台的新版本更新其 OIDC 颁发者 URL。我们将根据需要在范围内增加其他 Turbonomic OIDC 颁发者作为共享提供商。

对于 IAM 确定为共享的任何新的 OIDC IdP，将以类似的方式记录和执行角色信任策略所需的身份提供者控制。

## 其他资源
<a name="concept_additional_resources"></a>

其他资源
+ 有关如何为 OIDC 联合身份验证创建 IAM 角色的更多信息，请参阅 [创建用于 OpenID Connect 联合身份验证（控制台）的角色](id_roles_create_for-idp_oidc.md)。
+ 有关可用于声明的 IAM 条件键的列表，请参阅 [Amazon OIDC 联合身份验证的可用键](reference_policies_iam-condition-keys.md#condition-keys-wif)。

# SAML 2.0 联合身份验证
<a name="id_roles_providers_saml"></a>

Amazon 使用 [SAML 2.0（安全断言标记语言 2.0）](https://wiki.oasis-open.org/security)支持联合身份验证，SAML 2.0 是许多身份验证提供商 (IdP) 使用的一种开放标准。此功能可实现联合单点登录（SSO），因此用户可以登录 Amazon Web Services 管理控制台 或调用 Amazon API 操作，而不必为企业中的每个人都创建一个 IAM 用户。通过使用 SAML，您可以使用 Amazon 简化配置联合身份验证流程，因为您可以使用 IdP 的服务而不是[编写自定义身份代理代码](https://docs.amazonaws.cn/STS/latest/UsingSTS/CreatingFedTokens.html)。

**注意**  
IAM SAML 身份联合验证支持来自基于 SAML 的联合身份提供者（IdP）的加密 SAML 响应。IAM Identity Center 和 Amazon Cognito 不支持来自 IAM SAML 身份提供商的加密 SAML 断言。  
您可以将对加密 SAML 断言的支持间接添加到具有 Amazon Cognito 用户池的 Amazon Cognito 身份池联合身份验证。用户池具有独立于 IAM SAML 联合身份验证的 SAML 联合身份验证，并且支持 [SAML 签名和加密](https://docs.amazonaws.cn/cognito/latest/developerguide/cognito-user-pools-SAML-signing-encryption.html)。尽管此功能没有直接扩展到身份池，但用户池可以是身份池的 IDP。要对身份池使用 SAML 加密，请将具有加密的 SAML 提供商添加到一个用户池，其是身份池的 IdP。  
SAML 提供商必须能够使用用户池提供的密钥对 SAML 断言进行加密。用户池不接受使用 IAM 提供的证书进行加密的断言。

IAM 联合支持这些使用案例：
+ [**允许组织中的用户或应用程序调用 Amazon API 操作的联合访问权限**](#CreatingSAML-configuring)。下面的部分将讨论此用例。您可以使用组织内生成的 SAML 断言 (身份验证响应的一部分) 获得临时安全凭证。此方案类似于 IAM 支持的其他联合方案，如 [请求临时安全凭证](id_credentials_temp_request.md) 和 [OIDC 联合身份验证](id_roles_providers_oidc.md) 中介绍的方案。但是，企业中基于 SAML 2.0 的 IdP 可以在运行时处理很多细节功能，以用于执行身份验证和授权检查。
+ [**从组织向 Amazon Web Services 管理控制台进行基于 Web 的单一登录 (SSO)**](id_roles_providers_enable-console-saml.md)。用户可以登录您企业中由与 SAML 2.0 兼容的 IdP 托管的门户，选择转向 Amazon，并将其重新导向到控制台，而无需提供其他登录信息。您可以使用第三方 SAML IdP 建立对控制台的 SSO 访问，或者可以创建自定义 IdP 来支持外部用户的控制台访问。有关构建自定义 IdP 的更多信息，请参阅[使自定义身份凭证代理程序能够访问 Amazon 控制台](id_roles_providers_enable-console-custom-url.md)。

**Topics**
+ [

## 使用基于 SAML 的联合身份验证来对 Amazon 进行 API 访问
](#CreatingSAML-configuring)
+ [

## 配置基于 SAML 2.0 的联合身份验证的概述
](#CreatingSAML-configuring-IdP)
+ [

## 用于允许对 Amazon 资源进行 SAML 联合访问的角色的概述
](#CreatingSAML-configuring-role)
+ [

## 唯一标识基于 SAML 的联合中的用户
](#CreatingSAML-userid)
+ [

# 在 IAM 中创建 SAML 身份提供者
](id_roles_providers_create_saml.md)
+ [

# 配置具有依赖方信任的 SAML 2.0 IdP 并添加陈述
](id_roles_providers_create_saml_relying-party.md)
+ [

# 将第三方 SAML 解决方案提供者与 Amazon 集成
](id_roles_providers_saml_3rd-party.md)
+ [

# 为身份验证响应配置 SAML 断言。
](id_roles_providers_create_saml_assertions.md)
+ [

# 使 SAML 2.0 联合主体能够访问 Amazon Web Services 管理控制台
](id_roles_providers_enable-console-saml.md)
+ [

# 在您的浏览器中查看 SAML 响应
](troubleshoot_saml_view-saml-response.md)

## 使用基于 SAML 的联合身份验证来对 Amazon 进行 API 访问
<a name="CreatingSAML-configuring"></a>

假设您想要为员工提供一种将数据从他们的计算机中复制到备份文件夹的方法。您可以构建一个可在用户的计算机上运行的应用程序。在后端，该应用程序可在 Amazon S3 存储桶中读写对象。用户没有直接访问 Amazon 的权限。而应使用以下过程：

![\[获得基于 SAML 断言的临时安全证书\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/images/saml-based-federation-diagram.png)


1. 您组织中的用户使用客户端应用程序来请求您组织的 IdP 进行身份验证。

1. IdP 根据组织的身份存储对用户进行身份验证。

1. IdP 构建一个具有用户相关信息的 SAML 断言，并将此断言发送到客户端应用程序。当您为 IAM SAML IdP 启用 SAML 加密时，此断言将由外部 IdP 加密。

1. 客户端应用程序调用 Amazon STS [https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API，并传递 SAML 提供商的 ARN、要代入的角色的 ARN 以及来自 IdP 的 SAML 断言。如果启用了加密，则通过客户端应用程序传递的断言在传输过程中保持加密状态。

1. （可选）Amazon STS 使用您从外部 IdP 上传的私有密钥来解密加密的 SAML 断言。

1. API 对客户端应用程序的响应包括临时安全凭证。

1. 客户端应用程序使用临时安全凭证来调用 Amazon S3 API 操作。

## 配置基于 SAML 2.0 的联合身份验证的概述
<a name="CreatingSAML-configuring-IdP"></a>

在使用前面方案和图表中所述的基于 SAML 2.0 的联合身份验证之前，您必须先配置组织的 IdP 和您的 Amazon Web Services 账户，使之相互信任。以下步骤介绍了用于配置此信任的一般过程。组织内部必须有[支持 SAML 2.0 的 IdP](id_roles_providers_saml_3rd-party.md)，例如 Microsoft Active Directory 联合身份验证服务 (AD FS，Windows Server 的一部分)、Shibboleth 或其他兼容的 SAML 2.0 提供商。

**注意**  
为了提高联合身份验证弹性，我们建议您将 IdP 和Amazon联合身份验证配置为支持多个 SAML 登录端点。有关详细信息，请参阅 Amazon 安全博客文章[如何使用区域性 SAML 端点进行失效转移](https://www.amazonaws.cn/blogs//security/how-to-use-regional-saml-endpoints-for-failover)。

**配置组织的 IdP 和 Amazon 以使之相互信任**

1. 将 Amazon 注册为您组织的 IdP 的服务提供商（SP）。通过 `https://region-code.signin.amazonaws.cn/static/saml-metadata.xml` 使用 SAML 元数据文档

   有关可能的 *region-code* 值的列表，请参阅 [Amazon 登录端点](https://docs.amazonaws.cn/general/latest/gr/signin-service.html)中的 **Region**（区域）列。

   您可以选择通过 `https://signin.amazonaws.cn/static/saml-metadata.xml` 使用 SAML 元数据文档。

1. <a name="createxml"></a>通过使用您企业的 IdP，生成一个同等 SAML 元数据 XML 文件，该文件可将您的 IdP 描述为 Amazon 中的 IAM 身份提供者。它必须包括发布者名称、创建日期、过期日期以及 Amazon 可用来验证来自您组织的身份验证响应（断言）的密钥。

   如果允许从外部 IdP 发送加密的 SAML 断言，则必须使用组织的 IdP 生成私有密钥文件，并以 .pem 文件格式将此文件上传到 IAM SAML 配置。Amazon STS 需要此私有密钥文件来解密与上传到 IdP 的公有密钥对应的 SAML 响应。
**注意**  
如 [SAML V2.0 元数据互操作性配置文件 1.0 版](https://docs.oasis-open.org/security/saml/Post2.0/sstc-metadata-iop-os.html)所定义，IAM 既不会评估 SAML 元数据文档的 X.509 证书，也不会在该证书过期时采取任何行动。如果您担心 X.509 证书过期，建议您监控证书到期日期，并根据贵组织的治理和安全策略来轮换证书。

1. <a name="samlovrcreateentity"></a>在 IAM 控制台中，创建一个 SAML 身份提供商。在此过程中，您将上传 SAML 元数据文档和私有解密密钥，这些文档和私有解密密钥是由贵组织中的 IdP 在 [Step 2](#createxml) 中生成的。有关更多信息，请参阅 [在 IAM 中创建 SAML 身份提供者](id_roles_providers_create_saml.md)。

1. <a name="samlovrcreaterole"></a>在 IAM 中创建一个或多个 IAM 角色。在角色的信任策略中，您可将 SAML 提供商设置为可在您的组织与 Amazon 之间建立信任关系的主体。该角色的权限策略确定了允许您组织的用户在 Amazon 中执行的操作。有关更多信息，请参阅 [为第三方身份提供者创建角色](id_roles_create_for-idp.md)。
**注意**  
角色信任策略中使用的 SAML IdP 必须与角色位于同一账户中。

1. 在您企业的 IdP 中，定义可将您企业中的用户或组映射到 IAM 角色的断言。请注意，您的组织中不同的用户和组可能映射到不同的 IAM 角色。执行映射的确切步骤取决于您使用的 IdP。在用户 Amazon S3 文件夹中的[较早场景](#CreatingSAML-configuring)中，则所有用户都可能映射到提供 Amazon S3 权限的同一角色。有关更多信息，请参阅 [为身份验证响应配置 SAML 断言。](id_roles_providers_create_saml_assertions.md)。

   如果您的 IdP 支持对 Amazon 控制台的 SSO，则可配置控制台会话的最大持续时间。有关更多信息，请参阅 [使 SAML 2.0 联合主体能够访问 Amazon Web Services 管理控制台](id_roles_providers_enable-console-saml.md)。

1. 在您正在创建的应用程序中，您可以调用 Amazon Security Token Service `AssumeRoleWithSAML` API，将其传递给您在[Step 3](#samlovrcreateentity) 中创建的 SAML 提供商的 ARN、您在[Step 4](#samlovrcreaterole) 中创建的要代入的角色的 ARN 以及从您的 IdP 处获取的有关当前用户的 SAML 断言。Amazon 确保代入角色的请求来自 SAML 提供商所引用的 IdP。

   有关更多信息，请参阅[https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 参考*中的 Amazon Security Token ServiceAssumeRoleWithSAML*。

1. 如果请求成功，API 会返回一组临时安全凭证，您的应用程序即可用其向 Amazon 发出已签名的请求。您的应用程序具有有关当前用户的信息并可访问 Amazon S3 中用户特定的文件夹，如上一方案中所述。

## 用于允许对 Amazon 资源进行 SAML 联合访问的角色的概述
<a name="CreatingSAML-configuring-role"></a>

您在 IAM 中创建的角色将确定您组织中的 SAML 联合主体在 Amazon 中允许执行的操作。当您为角色创建信任策略时，您可以将先前创建的 SAML 提供商指定为 `Principal`。此外，您还可以使用 `Condition` 设置信任策略的范围，以便仅允许与特定 SAML 属性匹配的用户访问角色。例如，您可以指定仅允许 SAML 从属关系为 `staff` (在 https://openidp.feide.no 中断言) 的用户访问角色，如以下示例策略所示：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [{
    "Effect": "Allow",
    "Principal": {"Federated": "arn:aws:iam::111122223333:saml-provider/ExampleOrgSSOProvider"},
    "Action": "sts:AssumeRoleWithSAML",
    "Condition": {
      "StringEquals": {
        "saml:aud": "https://us-east-1.signin.aws.amazon.com/saml",
        "saml:iss": "https://openidp.feide.no"
      },
      "ForAllValues:StringLike": {"saml:edupersonaffiliation": ["staff"]}
    }
  }]
}
```

------

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws-cn:iam::111122223333:saml-provider/ExampleOrgSSOProvider"
            },
            "Action": "sts:AssumeRoleWithSAML",
            "Condition": {
                "StringEquals": {
                    "saml:aud": "https://ap-east-1.signin.amazonaws.cn/saml",
                    "saml:iss": "https://openidp.feide.no"
                },
                "ForAllValues:StringLike": {
                    "saml:edupersonaffiliation": [
                        "staff"
                    ]
                }
            }
        }
    ]
}
```

------

**注意**  
角色信任策略中使用的 SAML IdP 必须与角色位于同一账户中。

策略中的 `saml:aud` 上下文键指定登录控制台时浏览器显示的 URL。此登录端点 URL 必须与您的身份提供者的收件人属性相匹配。您可以添加特定区域内的登录 URL。Amazon 建议使用区域端点而不是全局端点，以提高联合身份验证的韧性。如果您只配置了一个端点，则如果该端点变得不可用（此情况发生可能性极小），您就无法通过联合身份验证登录 Amazon。有关可能的 *region-code* 值的列表，请参阅 [Amazon 登录端点](https://docs.amazonaws.cn/general/latest/gr/signin-service.html)中的 **Region**（区域）列。

以下示例显示了带有可选 `region-code` 的登录 URL 格式。

`https://region-code.signin.aws.amazon.com/saml`

如果需要 SAML 加密，则登录 URL 必须包含 Amazon 分配给您的 SAML 提供商的唯一标识符，您可以在身份提供者详细信息页面上找到该标识符。在以下示例中，登录 URL 包含要求在登录路径后附加 /acs/ 的 IdP 唯一标识符。

`https://region-code.signin.aws.amazon.com/saml/acs/IdP-ID`

对于该角色中的权限策略，您可以像任何角色一样指定权限。例如，如果允许您企业的用户管理 Amazon Elastic Compute Cloud 实例，您必须在权限策略中明确允许 Amazon EC2 操作，如 **AmazonEC2FullAccess** 托管策略中的操作。

有关您可以签入策略的 SAML 密钥的更多信息，请参阅[基于 SAML 的 Amazon STS 联合身份验证的可用键](reference_policies_iam-condition-keys.md#condition-keys-saml)。

## 唯一标识基于 SAML 的联合中的用户
<a name="CreatingSAML-userid"></a>

在 IAM 中创建访问策略时，可根据用户的身份指定权限，这一点通常很有用。举例来说，对于已使用 SAML 联合的用户，应用程序可能希望使用如下的结构保留 Amazon S3 中的信息：

```
amzn-s3-demo-bucket/app1/user1
amzn-s3-demo-bucket/app1/user2
amzn-s3-demo-bucket/app1/user3
```

您可以通过 Amazon S3 控制台或 Amazon CLI 创建存储桶 (`amzn-s3-demo-bucket`) 和文件夹 (`app1`)，因为这些都是静态值。但是，用户特定文件夹（*user1*、*user2*、*user3* 等）必须在运行时使用代码创建，因为在用户首次通过联合流程登录之前，用来标识用户的值是未知的。

要编写在资源名称中引用特定于用户的详细信息的策略，必须在可以用于策略条件的 SAML 密钥中提供用户身份。以下密钥可用于基于 SAML 2.0 的联合身份验证，以便在 IAM policy 中使用。您可以使用以下键返回的值为资源 (如 Amazon S3 文件夹) 创建唯一的用户标识符。
+ `saml:namequalifier`. 哈希值，基于 `Issuer` 响应值 (`saml:iss`)、包含 `AWS` 账户 ID 的字符串和 IAM 中 SAML 提供商的友好名称（ARN 的最后一部分）的串联。账户 ID 与 SAML 提供商的易记名称的串联可作为键 `saml:doc` 供 IAM policy 使用。账户 ID 与提供商名称必须使用“/”分隔，例如在“123456789012/provider\$1name”中。有关更多信息，请参阅`saml:doc` 上的 [基于 SAML 的 Amazon STS 联合身份验证的可用键](reference_policies_iam-condition-keys.md#condition-keys-saml) 键。

  `NameQualifier` 与 `Subject` 的组合可用于唯一识别 SAML 联合主体。以下伪代码显示如何计算此值。在此伪代码中，`+` 表示串联，`SHA1` 代表使用 SHA-1 生成消息摘要的功能，`Base64` 代表生成哈希输出的 Base-64 编码版本的功能。

   `Base64 ( SHA1 ( "https://example.com/saml" + "123456789012" + "/MySAMLIdP" ) )` 

   有关可用于基于 SAML 的联合的策略键的更多信息，请参阅[基于 SAML 的 Amazon STS 联合身份验证的可用键](reference_policies_iam-condition-keys.md#condition-keys-saml)。
+ `saml:sub`（字符串）。这是该陈述的主题，其中包含唯一标识组织中某个用户的值 (例如 `_cbb88bf52c2510eabe00c1642d4643f41430fe25e3`)。
+ `saml:sub_type`（字符串）。此键可以是 `persistent`、`transient` 或在您的 SAML 断言中使用的 `Format` 和 `Subject` 元素的完整 `NameID` URI。`persistent` 的值表示在所有会话中用户的 `saml:sub` 值是相同的。如果值为 `transient`，则用户在每个会话中拥有不同的 `saml:sub` 值。有关 `NameID` 元素的 `Format` 属性的信息，请参阅[为身份验证响应配置 SAML 断言。](id_roles_providers_create_saml_assertions.md)。

以下示例说明了一个权限策略，该策略使用上述密钥为 Amazon S3 中的用户特定文件夹授予权限。该策略假设 Amazon S3 对象使用同时包含 `saml:namequalifier` 和 `saml:sub` 的前缀进行标识。请注意，`Condition` 元素包括一个测试，用于确保 `saml:sub_type` 设置为 `persistent`。如果已设置为 `transient`，每个会话用户的 `saml:sub` 值可以不同，且不应使用值的组合来标识用户特定的文件夹。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "s3:GetObject",
      "s3:PutObject",
      "s3:DeleteObject"
    ],
    "Resource": [
      "arn:aws:s3:::amzn-s3-demo-bucket-org-data/backup/${saml:namequalifier}/${saml:sub}",
      "arn:aws:s3:::amzn-s3-demo-bucket-org-data/backup/${saml:namequalifier}/${saml:sub}/*"
    ],
    "Condition": {"StringEquals": {"saml:sub_type": "persistent"}}
  }
}
```

------

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "s3:GetObject",
      "s3:PutObject",
      "s3:DeleteObject"
    ],
    "Resource": [
      "arn:aws-cn:s3:::amzn-s3-demo-bucket-org-data/backup/${saml:namequalifier}/${saml:sub}",
      "arn:aws-cn:s3:::amzn-s3-demo-bucket-org-data/backup/${saml:namequalifier}/${saml:sub}/*"
    ],
    "Condition": {"StringEquals": {"saml:sub_type": "persistent"}}
  }
}
```

------

有关将断言从 IdP 映射到策略的更多信息，请参阅[为身份验证响应配置 SAML 断言。](id_roles_providers_create_saml_assertions.md)。

# 在 IAM 中创建 SAML 身份提供者
<a name="id_roles_providers_create_saml"></a>

IAM SAML 2.0 身份提供程序是 IAM 中的一个实体，该实体描述支持 [SAML 2.0 (安全断言标记语言 2.0)](https://wiki.oasis-open.org/security) 标准的外部身份提供程序 (IdP) 服务。如果您希望在与 SAML 兼容的 IdP（例如 Shibboleth 或 Active Directory 联合身份验证服务）和 Amazon 之间建立信任，以便企业中的用户能够访问 Amazon 资源，则需要使用 IAM 身份提供者。IAM SAML 身份提供程序用作 IAM 信任策略中的主体。

有关此方案的更多信息，请参阅[SAML 2.0 联合身份验证](id_roles_providers_saml.md)。

您可以在 Amazon Web Services 管理控制台 中或通过使用 Amazon CLI、Tools for Windows PowerShell 或 Amazon API 调用，创建和管理 IAM 身份提供程序。

创建 SAML 提供商后，必须创建一个或多个 IAM 角色。角色是 Amazon 中的一个实体，它没有自己的凭证（与用户一样）。但在此情况下，角色将动态分配给由 IdP 验证的 SAML 联合主体。该角色允许您的 IdP 请求临时安全凭证以便访问 Amazon。分配给该角色的策略决定了用户可在 Amazon 中执行的操作。要创建用于 SAML 联合的角色，请参阅[为第三方身份提供者创建角色](id_roles_create_for-idp.md)。

最后，在创建角色后，您可通过配置包含有关 Amazon 的信息的 IdP 以及希望 SAML 联合主体使用的角色来完成 SAML 信任。这称为在 IdP 和 Amazon 之间配置信赖方信任。要配置信赖方信任，请参阅[配置具有依赖方信任的 SAML 2.0 IdP 并添加陈述](id_roles_providers_create_saml_relying-party.md)。

**Topics**
+ [

## 先决条件
](#idp-manage-identityprovider-prerequisites)
+ [

## 创建和管理 IAM SAML 身份提供商（控制台）
](#idp-manage-identityprovider-console)
+ [

## 管理 SAML 加密密钥
](#id_federation_manage-saml-encryption)
+ [

## 创建和管理 IAM SAML 身份提供商 (Amazon CLI)
](#idp-create-identityprovider-CLI)
+ [

## 创建和管理 IAM SAML 身份提供商 (Amazon API)
](#idp-create-identityprovider-API)
+ [

## 后续步骤
](#id_roles_create-for-saml-next-steps)

## 先决条件
<a name="idp-manage-identityprovider-prerequisites"></a>

在创建 SAML 身份提供商之前，您必须从 IdP 处获得以下信息。
+ 从 IdP 中获取 SAML 元数据文档。此文档包括发布者名称、过期信息以及可用来验证从 IdP 处收到的 SAML 身份验证响应（断言）的密钥。要生成元数据文档，请使用外部 IdP 提供的身份管理软件。
**重要**  
此元数据文件包括颁发者名称、过期信息以及可用来验证从 IdP 处收到的 SAML 身份验证响应 (断言) 的密钥。元数据文件必须采用不含字节顺序标记 (BOM) 的 UTF-8 格式编码。要删除 BOM，您可以使用 Notepad\$1\$1 等文本编辑工具以 UTF-8 格式对文件进行编码。  
作为 SAML 元数据文档的一部分，X.509 证书必须使用长度至少为 1024 位的密钥。此外，X.509 证书也不能有任何重复的扩展名。您可以使用扩展程序，但扩展程序只能在证书中显示一次。如果 X.509 证书不符合任一条件，则 IdP 将创建失败，并返回“Unable to parse metadata”这一错误消息。  
如 [SAML V2.0 元数据互操作性配置文件 1.0 版](https://docs.oasis-open.org/security/saml/Post2.0/sstc-metadata-iop-os.html)所定义，IAM 既不会评估 SAML 元数据文档的 X.509 证书，也不会在该证书过期时采取任何行动。如果您担心 X.509 证书过期，建议您监控证书到期日期，并根据贵组织的治理和安全策略来轮换证书。
+ 选择启用 SAML 加密时，必须使用您的 IdP 生成私有密钥文件，并以 .pem 文件格式将此文件上传到 IAM SAML 配置。Amazon STS 需要此私有密钥文件来解密与 IdP 使用的公有密钥对应的 SAML 响应。支持下列算法：
  + 加密算法
    + AES-128
    + AES-256
    + RSA-OAEP
  + 密钥传输算法
    + AES-CBC
    + AES-GCM

  有关生成私有密钥的步骤，请参阅身份提供者的文档。
**注意**  
IAM Identity Center 和 Amazon Cognito 不支持来自 IAM SAML 身份提供商的加密 SAML 断言。您可以将对加密 SAML 断言的支持间接添加到具有 Amazon Cognito 用户池的 Amazon Cognito 身份池联合身份验证。用户池具有独立于 IAM SAML 联合身份验证的 SAML 联合身份验证，并且支持 [SAML 签名和加密](https://docs.amazonaws.cn/cognito/latest/developerguide/cognito-user-pools-SAML-signing-encryption.html)。尽管此功能没有直接扩展到身份池，但用户池可以是身份池的 IDP。要对身份池使用 SAML 加密，请将具有加密的 SAML 提供商添加到一个用户池，其是身份池的 IdP。  
SAML 提供商必须能够使用用户池提供的密钥对 SAML 断言进行加密。用户池不接受使用 IAM 提供的证书进行加密的断言。

有关如何配置许多可用 IdP 以使用 Amazon（包括如何生成所需的 SAML 元数据文档）的说明，请参阅[将第三方 SAML 解决方案提供者与 Amazon 集成](id_roles_providers_saml_3rd-party.md)。

有关 SAML 联合身份验证的帮助，请参阅 [SAML 联合身份验证故障排除](troubleshoot_saml.md)。

## 创建和管理 IAM SAML 身份提供商（控制台）
<a name="idp-manage-identityprovider-console"></a>

您可以使用 Amazon Web Services 管理控制台 来创建、更新和删除 IAM SAML 身份提供商。有关 SAML 联合身份验证的帮助，请参阅 [SAML 联合身份验证故障排除](troubleshoot_saml.md)。

**创建 IAM SAML 身份提供程序（控制台）**

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择 **Identity providers**（身份提供程序），然后选择 **Add provider**（添加提供商）。

1. 对于 **Configure provider**（配置提供商），选择 **SAML**。

1. 键入身份提供程序的名称。

1. 对于 **Metadata document**（元数据文档），选择 **Choose file**（选择文件），指定您在 [先决条件](#idp-manage-identityprovider-prerequisites) 中下载的 SAML 元数据文档。
**注意**  
SAML 元数据文档中的 `validUntil` 或 `cacheDuration` 属性定义了身份提供者的**有效期至**日期。如果 SAML 元数据文档不包含有效期属性，则**有效期至**日期将与 X.509 证书到期日期不匹配。  
IAM 不会对 SAML 元数据文档中的 X.509 证书过期进行评估或采取行动。如果您担心 X.509 证书过期，建议您监控证书到期日期，并根据贵组织的治理和安全策略来轮换证书。

1. （可选）对于 **SAML 加密**，请选择**选择文件**并选择您在[先决条件](#idp-manage-identityprovider-prerequisites)中创建的私有密钥文件。选择**需要加密**，以仅接受来自您的 IdP 的加密请求。

1. （可选）对于 **Add tags** (添加标签)，您可以添加键值对来帮助识别和组织您的 IdP。您还可以使用标签来控制对 Amazon 资源的访问。要了解有关标记 SAML 身份提供程序的更多信息，请参阅[标记 IAM SAML 身份提供者](id_tags_saml.md)。

   选择 **Add tag（添加标签）**。为每个标签键值对输入值。

1. 验证您提供的信息。完成后，选择 **Add provider**（添加提供商）。

1. 为您的身份提供商分配一个 IAM 角色。此角色授予由您的身份提供者管理的外部用户身份访问您账户中的 Amazon 资源的权限。要了解有关为联合身份创建角色的更多信息，请参阅 [为第三方身份提供者创建角色](id_roles_create_for-idp.md)
**注意**  
角色信任策略中使用的 SAML IdP 必须与角色位于同一账户中。

**删除 SAML 提供商（控制台）**

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择 **Identity providers**（身份提供程序）。

1. 选中要删除的身份提供程序旁边的单选按钮。

1. 选择**删除**。此时会打开一个新窗口。

1. 通过在字段中键入 `delete` 一词以确认您要删除此提供商。然后选择 **Delete**(删除)。

## 管理 SAML 加密密钥
<a name="id_federation_manage-saml-encryption"></a>

您可以将 IAM SAML 提供商配置为在来自外部 IdP 的 SAML 响应中接收加密断言。用户可以通过调用 `[sts:AssumeRoleWithSAML](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithSAML.html)` 来使用加密的 SAML 断言在 Amazon 中代入角色。

SAML 加密确保断言在通过中介或第三方传递时是安全的。此外，此功能可帮助您满足 FedRAMP 或任何要求对 SAML 断言进行加密的内部合规策略要求。

要配置 IAM SAML 身份提供商，请参阅 [在 IAM 中创建 SAML 身份提供者](#id_roles_providers_create_saml)。有关 SAML 联合身份验证的帮助，请参阅 [SAML 联合身份验证故障排除](troubleshoot_saml.md)。

### 轮换 SAML 加密密钥
<a name="id_federation_manage-saml-keys-rotate"></a>

IAM 使用您上传到 IAM SAML 提供商的私有密钥来解密来自 IdP 的加密 SAML 断言。每个身份提供商最多可以保存两个私钥文件，允许您根据需要轮换私钥。保存两个文件后，每个请求将首先尝试使用最新的**添加**日期进行解密，然后 IAM 尝试使用最旧的**添加**日期对请求进行解密。

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择**身份提供商**，然后从列表中选择您的提供商。

1. 选择 **SAML 加密**选项卡，然后选择**添加新密钥**。

1. 选择**选择文件**，并将您从 IdP 下载的私有密钥作为 .pem 文件上传。然后，选择**添加密钥**。

1. 在**用于 SAML 解密的私钥**部分，选择已过期的私钥文件，然后选择**删除**。建议您在添加新的私有密钥后删除过期的私有密钥，以确保首次尝试断言解密的成功。

## 创建和管理 IAM SAML 身份提供商 (Amazon CLI)
<a name="idp-create-identityprovider-CLI"></a>

您可以使用 Amazon CLI 来创建、更新和删除 SAML 提供商。有关 SAML 联合身份验证的帮助，请参阅 [SAML 联合身份验证故障排除](troubleshoot_saml.md)。

**创建 IAM 身份提供程序并上传元数据文档 (Amazon CLI)**
+ 运行以下命令：[https://docs.amazonaws.cn/cli/latest/reference/iam/create-saml-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/create-saml-provider.html)

**更新 IAM SAML 身份提供商 (Amazon CLI)**

您可以更新 IAM SAML 提供商的元数据文件、SAML 加密设置并轮换私钥解密文件。要轮换私有密钥，请添加您的新私有密钥，然后在单独的请求中删除旧密钥。有关轮换私有密钥的更多信息，请参阅 [管理 SAML 加密密钥](#id_federation_manage-saml-encryption)。
+ 运行以下命令：[https://docs.amazonaws.cn/cli/latest/reference/iam/update-saml-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/update-saml-provider.html)

**要标记现有 IAM 身份提供程序 (Amazon CLI)**
+ 运行以下命令：[https://docs.amazonaws.cn/cli/latest/reference/iam/tag-saml-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/tag-saml-provider.html)

**要列出现有 IAM 身份提供程序 (Amazon CLI) 的标签**
+ 运行以下命令：[https://docs.amazonaws.cn/cli/latest/reference/iam/list-saml-provider-tags.html](https://docs.amazonaws.cn/cli/latest/reference/iam/list-saml-provider-tags.html)

**要删除现有 IAM 身份提供程序 (Amazon CLI) 的标签**
+ 运行以下命令：[https://docs.amazonaws.cn/cli/latest/reference/iam/untag-saml-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/untag-saml-provider.html)

**删除 IAM SAML 身份提供程序 (Amazon CLI)**

1. （可选）要列出所有提供商的信息（例如 ARN、创建日期和过期时间），请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/list-saml-providers.html](https://docs.amazonaws.cn/cli/latest/reference/iam/list-saml-providers.html)

1. （可选）要获取有关特定提供商的信息，如 ARN、创建日期、过期日期、加密设置和私钥信息，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/get-saml-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/get-saml-provider.html)

1. 要删除 IAM 身份提供程序，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/delete-saml-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/delete-saml-provider.html)

## 创建和管理 IAM SAML 身份提供商 (Amazon API)
<a name="idp-create-identityprovider-API"></a>

您可以使用 Amazon API 来创建、更新和删除 SAML 提供商。有关 SAML 联合身份验证的帮助，请参阅 [SAML 联合身份验证故障排除](troubleshoot_saml.md)。

**创建 IAM 身份提供程序并上传元数据文档 (Amazon API)**
+ 调用此操作：[https://docs.amazonaws.cn/IAM/latest/APIReference/API_CreateSAMLProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_CreateSAMLProvider.html)

**更新 IAM SAML 身份提供商 (Amazon API)**

您可以更新 IAM SAML 提供商的元数据文件、SAML 加密设置并轮换私钥解密文件。要轮换私有密钥，请添加您的新私有密钥，然后在单独的请求中删除旧密钥。有关轮换私有密钥的更多信息，请参阅 [管理 SAML 加密密钥](#id_federation_manage-saml-encryption)。
+ 调用此操作：[https://docs.amazonaws.cn/IAM/latest/APIReference/API_UpdateSAMLProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_UpdateSAMLProvider.html)

**要标记现有 IAM 身份提供程序 (Amazon API)**
+ 调用此操作：[https://docs.amazonaws.cn/IAM/latest/APIReference/API_TagSAMLProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_TagSAMLProvider.html)

**要列出现有 IAM 身份提供程序 (Amazon API) 的标签**
+ 调用此操作：[https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListSAMLProviderTags.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListSAMLProviderTags.html)

**要删除现有 IAM 身份提供程序的标签 (Amazon API)**
+ 调用此操作：[https://docs.amazonaws.cn/IAM/latest/APIReference/API_UntagSAMLProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_UntagSAMLProvider.html)

**删除 IAM 身份提供程序 (Amazon API)**

1. （可选）要列出所有 IdP 的信息（例如 ARN、创建日期和过期时间），请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListSAMLProviders.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListSAMLProviders.html)

1. （可选）要获取有关特定提供商的信息，如 ARN、创建日期、过期日期、加密设置和私钥信息，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetSAMLProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetSAMLProvider.html)

1. 要删除 IdP，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_DeleteSAMLProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_DeleteSAMLProvider.html)

## 后续步骤
<a name="id_roles_create-for-saml-next-steps"></a>

创建 SAML 身份提供商后，通过您的 IdP 设置依赖方信任。您还可以在策略中使用 IdP 身份验证响应中的声明控制对角色的访问。
+ 您必须告知 IdP 将 Amazon 作为服务提供商。这称为在 IdP 和 Amazon 之间添加依赖方信任。添加信赖方信任的具体步骤取决于您使用的 IdP。有关更多信息，请参阅 [配置具有依赖方信任的 SAML 2.0 IdP 并添加陈述](id_roles_providers_create_saml_relying-party.md)。
+ 当 IdP 将包含断言的响应发送到 Amazon 时，许多传入断言将映射到 Amazon 上下文密钥。您可以使用 Condition 元素在 IAM 策略中使用这些上下文键来控制对角色的访问权限。有关详细信息，请参阅 [为身份验证响应配置 SAML 断言。](id_roles_providers_create_saml_assertions.md)

# 配置具有依赖方信任的 SAML 2.0 IdP 并添加陈述
<a name="id_roles_providers_create_saml_relying-party"></a>

当您创建 IAM 身份提供程序和用于 SAML 访问的角色时，您实际上将告知 Amazon 关于外部身份提供程序 (IdP) 的信息以及允许其用户执行的操作。下一步是让 IdP 知道 Amazon 作为服务提供商。这称为在 IdP 和 Amazon 之间添加*依赖方信托*。添加信赖方信任的具体步骤取决于您使用的 IdP。有关详细信息，请参阅身份管理软件对应的文档。

许多 IdP 允许指定一个 URL，他们可从中读取包含信赖方信息和证书的 XML 文档。对于 Amazon，请使用登录端点 URL。以下示例显示了包含可选 `region-code` 的 URL 格式。

`https://region-code.signin.aws.amazon.com/static/saml-metadata.xml`

如果需要 SAML 加密，则 URL 必须包含 Amazon 分配给您的 SAML 提供商的唯一标识符，您可以在身份提供者详细信息页面上找到该标识符。以下示例显示了包含唯一标识符的区域登录 URL。

`https://region-code.signin.aws.amazon.com/static/saml/IdP-ID/saml-metadata.xml`

有关可能的 *region-code* 值的列表，请参阅 [Amazon 登录端点](https://docs.amazonaws.cn/general/latest/gr/signin-service.html)中的 **Region**（区域）列。对于 Amazon 值，您也可以使用非区域端点 `https://signin.aws.amazon.com/saml`。

如果您无法直接指定 URL，请从之前的 URL 下载 XML 文档，然后将其导入您的 IdP 软件。

您还需要在指定 Amazon 作为信赖方的 IdP 中，创建相应的声明规则。当 IdP 向 Amazon 终端节点发送 SAML 响应时，它包括具有一个或多个*索赔* 的 SAML *断言*。断言是有关用户及其组的信息。断言规则将该信息映射到 SAML 属性中。这可确保来自 IdP 的 SAML 身份验证响应包含 IAM 策略中 Amazon 用于检查 SAML 联合主体权限的必要属性。有关更多信息，请参阅以下主题：
+  [用于允许对 Amazon 资源进行 SAML 联合访问的角色的概述](id_roles_providers_saml.md#CreatingSAML-configuring-role)。本主题将讨论如何在 IAM 策略中使用特定于 SAML 的键以及如何使用它们限制 SAML 联合主体的权限。
+ [为身份验证响应配置 SAML 断言。](id_roles_providers_create_saml_assertions.md). 本主题将讨论如何配置包括用户相关信息的 SAML 陈述。将声明捆绑到 SAML 断言中并包括在发送到 Amazon 的 SAML 响应中。您必须确保 Amazon 策略所需的信息以 Amazon 可识别和使用的形式包括在 SAML 断言中。
+  [将第三方 SAML 解决方案提供者与 Amazon 集成](id_roles_providers_saml_3rd-party.md)。本主题提供了由第三方组织提供的关于如何与 Amazon 集成身份解决方案的文档链接。

**注意**  
为了提高联合身份验证弹性，我们建议您将 IdP 和Amazon联合身份验证配置为支持多个 SAML 登录端点。有关详细信息，请参阅 Amazon 安全博客文章[如何使用区域性 SAML 端点进行失效转移](https://www.amazonaws.cn/blogs//security/how-to-use-regional-saml-endpoints-for-failover)。

# 将第三方 SAML 解决方案提供者与 Amazon 集成
<a name="id_roles_providers_saml_3rd-party"></a>

**注意**  
我们建议您要求您的人类用户在访问 Amazon 时使用临时凭证。您是否考虑过使用 Amazon IAM Identity Center？ 您可以使用 IAM Identity Center 集中管理对多个 Amazon Web Services 账户 的访问权限，并为用户提供受 MFA 保护的单点登录访问权限，可从一个位置访问其分配的所有账户。借助 IAM Identity Center，您可以在 IAM Identity Center 中创建和管理用户身份，或者轻松连接到现有的 SAML 2.0 兼容身份提供者。有关更多信息，请参阅*《Amazon IAM Identity Center 用户指南》*中的[什么是 IAM Identity Center？](https://docs.amazonaws.cn/singlesignon/latest/userguide/what-is.html)。

以下链接将帮助您配置第三方 SAML 2.0 身份提供程序 (IdP) 解决方案以利用 Amazon 联合身份验证。请与您的身份提供商联系，以确定他们是否支持 SAML 令牌加密。有关 SAML 加密要求，请参阅 [管理 SAML 加密密钥](id_roles_providers_create_saml.md#id_federation_manage-saml-encryption)。

**提示**  
Amazon Support 工程师可以帮助有商业和企业支持计划的客户完成涉及第三方软件的一些集成任务。有关受支持的平台和应用程序的最新列表，请参阅《Amazon Support 常见问题》中的[支持哪些第三方软件？](https://www.amazonaws.cn/premiumsupport/faqs/#what3rdParty)。


****  

| 解决方案 | 更多信息 | 
| --- | --- | 
| Auth0 |  [与 Amazon Web Services 集成](https://auth0.com/docs/integrations/aws) – Auth0 文档网站上的此页面包含了介绍如何使用 Amazon Web Services 管理控制台 来设置单点登录（SSO）的资源的链接，并提供了一个 JavaScript 示例。您可以配置 Auth0 来传递[会话标签](id_session-tags.md)。有关更多信息，请参阅 [Auth0 宣布与 Amazon 合作开发 IAM 会话标签](https://auth0.com/blog/auth0-partners-with-aws-for-iam-session-tags/)。 | 
| Microsoft Entra |  [教程：Microsoft Entra SSO 与 Amazon 单账户访问集成](https://learn.microsoft.com/en-us/azure/active-directory/saas-apps/amazon-web-service-tutorial) - Microsoft 网站上的这篇教程介绍了如何使用 SAML 联合身份验证将 Microsoft Entra（以前称为 Azure AD）设置为身份提供者（IdP）。 | 
| Centrify | [Configure Centrify and Use SAML for SSO to Amazon](https://docs.centrify.com/Content/Applications/AppsWeb/AmazonSAML.htm)（配置 Centrify 并对亚马逊云科技使用 SAML SSO）- 此 Centrify 网站页面说明如何配置 Centrify 以对 Amazon 使用 SAML SSO。 | 
| CyberArk | 配置 [CyberArk](https://docs.cyberark.com/Product-Doc/OnlineHelp/Idaptive/Latest/en/Content/Applications/AppsWeb/AmazonSAML.htm)，以便为从 CyberArk 用户门户通过 SAML 单点登录(SSO)登入的用户提供 Amazon Web Services (Amazon) 访问。 | 
| ForgeRock | [ForgeRock Identity Platform](https://backstage.forgerock.com/docs/am/6.5/saml2-guide/#saml2-create-hosted-idp) 与 Amazon 集成。您可以配置 ForgeRock 来传递[会话标签](id_session-tags.md)。有关更多信息，请参阅 [Amazon Web Services 的基于属性的访问控制](https://www.forgerock.com/blog/attribute-based-access-control-amazon-web-services)。 | 
| Google Workspace | [Amazon Web Services 云应用程序](https://support.google.com/a/answer/6194963) - 这篇有关 Google Workspace Admin Help 站点的文章描述了如何将 Google Workspace 配置为 SAML 2.0 IdP，并使用 Amazon 作为服务提供程序。 | 
| IBM | 您可以配置 IBM 来传递[会话标签](id_session-tags.md)。有关更多信息，请参阅 [IBM Cloud Identity IDaaS（最早支持 Amazon 会话标签的解决方案之一）](https://community.ibm.com/community/user/security/blogs/adam-case/2019/11/25/ibm-cloud-identity-idaas-one-of-first-to-support-aws-session-tags)。 | 
| JumpCloud |  [为 Amazon 单点登录（SSO）授予通过 IAM 角色进行访问的权限Amazon](https://support.jumpcloud.com/support/s/article/Granting-Access-via-IAM-Roles-for-Single-Sign-On-SSO-with-Amazon-AWS) – 这篇有关 JumpCloud 网站的文章将描述如何为 Amazon 设置与启用基于 IAM 角色的 SSO。 | 
| Matrix42 | [MyWorkspace 入门指南](https://myworkspace.matrix42.com/documents/MyWorkspace-Getting-Started-with-AWS.pdf) - 本指南介绍如何将 Amazon 身份服务与 Matrix42 MyWorkspace 集成。 | 
| Microsoft Active Directory 联合身份验证服务 (AD FS) |  [现场记录：将 Active Directory 联合身份验证服务与 Amazon IAM Identity Center 集成](https://www.amazonaws.cn/blogs/architecture/field-notes-integrating-active-directory-federation-service-with-aws-single-sign-on/) – Amazon 架构博客上的这篇文章介绍了 AD FS 与 Amazon IAM Identity Center（IAM Identity Center）之间的身份验证流。IAM Identity Center 通过 SAML 2.0 支持身份联合验证，从而得以与 AD FS 解决方案集成。用户可使用其企业凭证登录 IAM Identity Center 门户，从而减少在 IAM Identity Center 上维护单独凭证的管理开销。您也可以配置 AD FS 来传递[会话标签](id_session-tags.md)。有关更多信息，请参阅[将基于属性的访问控制与 AD FS 结合使用来简化 IAM 权限管理](https://www.amazonaws.cn/blogs/security/attribute-based-access-control-ad-fs-simplify-iam-permissions-management/)。  | 
| miniOrange | [SSO for Amazon](http://miniorange.com/amazon-web-services-%28aws%29-single-sign-on-%28sso%29) - miniOrange 网站上的此页面介绍如何为企业建立对 Amazon 的安全访问以及对 Amazon 应用程序访问的完全控制。 | 
| Okta |  [使用 Okta 集成 Amazon Web Services Command Line Interface](https://support.okta.com/help/Documentation/Knowledge_Article/Integrating-the-Amazon-Web-Services-Command-Line-Interface-Using-Okta) - 通过 Okta 支持网站上的此页面可以了解如何配置 Okta 才能与 Amazon 配合使用。您可以配置 Okta 来传递[会话标签](id_session-tags.md)。有关更多信息，请参阅 [Okta 与 Amazon 合作，通过会话标签简化访问](https://www.okta.com/blog/2019/11/okta-and-aws-partner-to-simplify-access-via-session-tags/)。 | 
| Okta | [Amazon 账户联合身份验证 ](https://help.okta.com/oie/en-us/Content/Topics/DeploymentGuides/AWS/aws-deployment.htm) - Okta 网站上的此部分介绍如何为 Amazon 设置和启用 IAM Identity Center。 | 
| OneLogin | 从 [OneLogin 知识库](https://onelogin.service-now.com/support)中，搜索 SAML Amazon 以获取文章列表，这些文章介绍了如何在 OneLogin 与 Amazon 之间设置 IAM Identity Center 功能，以实现单角色和多角色方案。您可以配置 OneLogin 来传递[会话标签](id_session-tags.md)。有关更多信息，请参阅 [OneLogin 和会话标签：Amazon 资源的基于属性的访问控制](https://www.onelogin.com/blog/aws-session-tags-integration)。 | 
| Ping Identity |  [PingFederate Amazon Connector](https://support.pingidentity.com/s/marketplace-integration-details?recordId=a7i1W0000004HBwQAM) – 查看有关 PingFederate Amazon Connector 的详细信息，快速连接模板来轻松设置单点登录 (SSO) 和预配置连接。阅读文档，并下载最新的 PingFederate Amazon Connector，以便与 Amazon 集成。您可以配置 Ping Identity 来传递 [会话标签](id_session-tags.md)。有关更多信息，请参阅[宣布推出针对 Amazon 中的基于属性的访问控制的 Ping 身份支持](https://support.pingidentity.com/s/document-item?bundleId=integrations&topicId=pon1571779451105.html)。  | 
| RadiantLogic | [Radiant Logic 技术合作伙伴](http://www.radiantlogic.com/about/partners/technology-partners/) - Radiant Logic 的 RadiantOne Federated Identity Service 与 Amazon 进行了集成，可以为基于 SAML 的 SSO 提供身份中心。 | 
| RSA | 《[Amazon Web Services - RSA Ready 实施指南](https://community.rsa.com/s/article/Amazon-Web-Services-RSA-Ready-Implementation-Guide)》为集成 Amazon 和 RSA 提供了指导。有关 SAML 配置的更多信息，请参阅 [Amazon Web Services - SAML 我的页面 SSO 配置 - RSA Ready 实施指南](https://community.rsa.com/s/article/Amazon-Web-Services-SAML-My-Page-SSO-Configuration-RSA-Ready-Implementation-Guide)。 | 
| Salesforce.com |  [How to configure SSO from Salesforce to Amazon](https://developer.salesforce.com/page/Configuring-SAML-SSO-to-AWS) - Salesforce.com 开发人员站点上的这篇方法文章介绍如何在 Salesforce 中设置身份提供程序 (IdP) 以及如何将 Amazon 配置为服务提供商。 | 
| SecureAuth |  [Amazon - SecureAuth SAML SSO](https://docs.secureauth.com/2104/en/amazon-web-services--aws---idp-initiated--integration-guide.html) - SecureAuth 网站上的该文章介绍了如何设置 SAML 以与 SecureAuth 设备的 Amazon 集成在一起。 | 
| Shibboleth |  [如何使用 Shibboleth 对 Amazon Web Services 管理控制台 进行 SSO](https://www.amazonaws.cn/blogs/security/how-to-use-shibboleth-for-single-sign-on-to-the-aws-management-console) - Amazon 安全博客中的这篇文章提供分步教程，介绍如何设置 Shibboleth 并将它配置为 Amazon 的身份提供程序。您可以配置 Shibboleth 来传递[会话标签](id_session-tags.md)。 | 

有关更多详细信息，请参阅 Amazon 网站上的 [IAM 合作伙伴](https://www.amazonaws.cn/iam/partners/)页面。

# 为身份验证响应配置 SAML 断言。
<a name="id_roles_providers_create_saml_assertions"></a>

在您验证组织中的用户身份后，外部身份提供者（IdP）将向 Amazon 登录端点 URL 发送身份验证响应。此响应是一个包含 SAML 令牌的 POST 请求，该令牌遵循[适用于 SAML 2.0 的 HTTP POST 绑定](http://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf)标准，其中包含以下元素或*断言*。您可在与 SAML 兼容的 IdP 中配置这些断言。请参考 IdP 文档，以了解有关如何输入这些声明的说明。

当 IdP 将包含断言的响应发送到 Amazon 时，许多传入断言将映射到 Amazon 上下文密钥。可以在 IAM policy 中使用 `Condition` 元素检查这些上下文密钥。可用映射的列表如[将 SAML 属性映射到 Amazon 信任策略上下文密钥](#saml-attribute-mapping)部分中所示。

## `Subject` 和 `NameID`
<a name="saml_subject-name-id"></a>

响应必须恰好具有一个 `SubjectConfirmation` 元素，该元素具有同时包含 `NotOnOrAfter` 和 `Recipient` 属性的 `SubjectConfirmationData` 元素。收件人属性必须包含与 Amazon 登录端点 URL 匹配的值。您的 IdP 可能会使用 `ACS`、`Recipient`、或 `Target` 这样的术语来指代此属性。

如果需要 SAML 加密，则登录 URL 必须包含 Amazon 分配给您的 SAML 提供商的唯一标识符，您可以在身份提供者详细信息页面上找到该标识符。以下示例显示了带有可选 `region-code` 的登录 URL 格式。

`https://region-code.signin.aws.amazon.com/saml`

在以下示例中，登录 URL 包含要求在登录路径后附加 /acs/ 的唯一标识符。

`https://region-code.signin.aws.amazon.com/saml/acs/IdP-ID`

有关可能的 *region-code* 值的列表，请参阅 [Amazon 登录端点](https://docs.amazonaws.cn/general/latest/gr/signin-service.html)中的 **Region**（区域）列。对于 Amazon 值，您还可以使用全局登录端点 `https://signin.aws.amazon.com/saml`。

`NameID` 元素的值可以是持久性的、瞬态的或由 IdP 解决方案提供的完整格式 URI 构成。持久性值表示在不同会话之间用户的 `NameID` 值是相同的。如果值是瞬态的，则用户在每个会话中拥有不同的 `NameID` 值。单点登录交互支持以下类型的标识符：
+ `urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`
+ `urn:oasis:names:tc:SAML:2.0:nameid-format:transient`
+ `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`
+ `urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified`
+ `urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName`
+ `urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName`
+ `urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos`
+ `urn:oasis:names:tc:SAML:2.0:nameid-format:entity`

以下摘录显示了一个示例。用您自己的值替代标记值。

```
<Subject>
  <NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">_cbb88bf52c2510eabe00c1642d4643f41430fe25e3</NameID>
  <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
    <SubjectConfirmationData NotOnOrAfter="2013-11-05T02:06:42.876Z" Recipient="https://region-code.signin.aws.amazon.com/saml/SAMLSP4SHN3UIS2D558H46"/>
  </SubjectConfirmation>
</Subject>
```

**重要**  
`saml:aud` 上下文键来自 SAML *recipient* 属性，因为它等同于 OIDC 受众字段（例如 `accounts.google.com:aud`）的 SAML。

## `PrincipalTag` SAML 属性
<a name="saml_role-session-tags"></a>

（可选）您可使用将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/PrincipalTag:{TagKey}` 的 `Attribute` 元素。此元素允许您将属性作为 SAML 断言中的会话标签传递。有关会话标签的更多信息，请参阅 [在 Amazon STS 中传递会话标签](id_session-tags.md)。

要将属性作为会话标签传递，请包含指定标签值的 `AttributeValue` 元素。例如，要传递标签键/值对 `Project` = `Marketing` 和 `CostCenter` = `12345`，请使用以下属性。为每个标签包含一个单独的 `Attribute` 元素。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:Project">
  <AttributeValue>Marketing</AttributeValue>
</Attribute>
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:CostCenter">
  <AttributeValue>12345</AttributeValue>
</Attribute>
```

要将上述标签设置为可传递，请包含另一个 `Attribute` 元素并将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/TransitiveTagKeys`。这是一个可选的多值属性，可将您的会话标签设置为可传递。当您使用 SAML 会话代入 Amazon 中的另一个角色时，可传递标签将保留。这称为[角色链](id_roles.md#iam-term-role-chaining)。例如，要将 `Principal` 和 `CostCenter` 标签均设置为可传递，请使用以下属性指定键。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/TransitiveTagKeys">
  <AttributeValue>Project</AttributeValue>
  <AttributeValue>CostCenter</AttributeValue>
</Attribute>
```

## `Role` SAML 属性
<a name="saml_role-attribute"></a>

您可使用将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/Role` 的 `Attribute` 元素。此元素包含一个或多个 `AttributeValue` 元素，这些元素可列出用户通过 IdP 映射到的 IAM 身份提供程序和角色。IAM 角色和 IAM 身份提供程序指定为逗号分隔的 ARN 对，格式与传递到 [AssumeRoleWithSAML](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithSAML.html) 的 `RoleArn` 和 `PrincipalArn` 参数相同。此元素必须至少包含一个角色/提供商对（`AttributeValue` 元素），也可以包含多个对。如果该元素包含多个对，则用户需要选择其使用 WebSSO 登录 Amazon Web Services 管理控制台 时要代入的角色。

**重要**  
`Name` 标签中 `Attribute` 属性的值区分大小写。必须将其一字不差地设置为 `https://aws.amazon.com/SAML/Attributes/Role`。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/Role">
  <AttributeValue>arn:aws:iam::account-number:role/role-name1,arn:aws:iam::account-number:saml-provider/provider-name</AttributeValue>
  <AttributeValue>arn:aws:iam::account-number:role/role-name2,arn:aws:iam::account-number:saml-provider/provider-name</AttributeValue>
  <AttributeValue>arn:aws:iam::account-number:role/role-name3,arn:aws:iam::account-number:saml-provider/provider-name</AttributeValue>
</Attribute>
```

## `RoleSessionName` SAML 属性
<a name="saml_role-session-attribute"></a>

您可使用将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/RoleSessionName` 的 `Attribute` 元素。该元素包含一个为临时凭证提供标识符的 `AttributeValue` 元素，这些凭证是针对 SSO 颁发的。您可以使用此选项将临时凭证与正在使用您应用程序的用户相关联。该元素用于在 Amazon Web Services 管理控制台中显示用户信息。`AttributeValue` 元素中的值长度必须介于 2 到 64 个字符之间，只能包含字母数字字符、下划线和以下字符：**. , \$1 = @ -**（连字符）。它不能含有空格。该值通常是用户 ID (`john`) 或电子邮件地址 (`johndoe@example.com`)。该值不应包含空格，如用户的显示名称 (`John Doe`)。

**重要**  
`Name` 标签中 `Attribute` 属性的值区分大小写。必须将其一字不差地设置为 `https://aws.amazon.com/SAML/Attributes/RoleSessionName`。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName">
  <AttributeValue>user-id-name</AttributeValue>
</Attribute>
```

## `SessionDuration` SAML 属性
<a name="saml_role-session-duration"></a>

（可选）您可使用将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/SessionDuration"` 的 `Attribute` 元素。该元素包含一个 `AttributeValue` 元素，它指定用户在必须请求新的临时凭证之前可访问 Amazon Web Services 管理控制台的时间长度。该值是一个表示会话秒数的整数。该值的范围是 900 秒 (15 分钟) 到 43200 秒 (12 小时)。如果该属性不存在，则凭证持续时间为 1 小时 (`DurationSeconds` API 的 `AssumeRoleWithSAML` 参数的默认值)。

要使用该属性，您必须配置 SAML 提供商，以通过控制台登录 Web 终端节点 (`https://region-code.signin.aws.amazon.com/saml`) 提供对 Amazon Web Services 管理控制台的单一登录访问。有关可能的 *region-code* 值的列表，请参阅 [Amazon 登录端点](https://docs.amazonaws.cn/general/latest/gr/signin-service.html)中的 **Region**（区域）列。您可以选择使用以下 URL：`https://signin.aws.amazon.com/static/saml`。请注意，该属性仅将会话扩展到 Amazon Web Services 管理控制台。它不能延长其他凭证的有效期。但是，如果它存在于 `AssumeRoleWithSAML` API 调用中，则可以用来*缩短* 会话的持续时间。调用返回的凭证的默认生命周期为 60 分钟。

另请注意，如果还定义了 `SessionNotOnOrAfter` 属性，则两个属性的 ***lesser***（较小值）（`SessionDuration` 或 `SessionNotOnOrAfter`）将建立控制台会话的最大持续时间。

在启用具有更长持续时间的控制台会话时，可能产生凭证外泄的风险。为了帮助缓解这种风险，您可以通过在 IAM 控制台页面的 **Role Summary **(角色摘要) 上选择 **Revoke Sessions**（撤销会话）立即禁用所有角色的有效控制台会话。有关更多信息，请参阅 [撤销 IAM 角色临时安全凭证](id_roles_use_revoke-sessions.md)。

**重要**  
`Name` 标签中 `Attribute` 属性的值区分大小写。必须将其一字不差地设置为 `https://aws.amazon.com/SAML/Attributes/SessionDuration`。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/SessionDuration">
  <AttributeValue>1800</AttributeValue>
</Attribute>
```

## `SourceIdentity` SAML 属性
<a name="saml_sourceidentity"></a>

（可选）您可使用将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/SourceIdentity` 的 `Attribute` 元素。该元素包含一个 `AttributeValue` 元素，为使用 IAM 角色的人员或应用程序提供标识符。当您使用 SAML 会话代入 Amazon 中的另一个角色时，源身份的值将保留，称为[角色链](id_roles.md#iam-term-role-chaining)。源身份的值存在于对角色会话期间执行的每个操作的请求中。在角色会话期间无法更改已设置的值。然后，管理员可以使用 Amazon CloudTrail 日志来监控和审计源身份信息，以确定谁在使用共享角色执行操作。

`AttributeValue` 元素中的值长度必须介于 2 到 64 个字符之间，只能包含字母数字字符、下划线和以下字符：**. , \$1 = @ -**（连字符）。它不能含有空格。该值通常是与用户关联的属性，例如用户 ID (`john`) 或电子邮件地址 (`johndoe@example.com`)。该值不应包含空格，如用户的显示名称 (`John Doe`)。有关使用基于身份的策略的更多信息，请参阅 [监控和控制使用所担任角色执行的操作](id_credentials_temp_control-access_monitor.md)。

**重要**  
如果您的 SAML 断言配置为使用 [`SourceIdentity`](#saml_sourceidentity) 属性，则您的角色信任策略还必须包含 `sts:SetSourceIdentity` 操作，否则代入角色操作会失败。有关使用基于身份的策略的更多信息，请参阅 [监控和控制使用所担任角色执行的操作](id_credentials_temp_control-access_monitor.md)。

要传递源身份属性，请包含 `AttributeValue` 元素，指定源身份的值。例如，要传递源身份 `Diego` 使用以下属性。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/SourceIdentity">
  <AttributeValue>Diego</AttributeValue>
```

## 将 SAML 属性映射到 Amazon 信任策略上下文密钥
<a name="saml-attribute-mapping"></a>

本部分中的表列出了常用的 SAML 属性以及它们在 Amazon 中映射到信任策略条件上下文密钥的方式。您可以使用这些键来控制对角色的访问。为此，请将键与 SAML 访问请求中所附带断言包含的值进行比较。

**重要**  
这些键仅在 IAM 信任策略（可决定谁能担任角色的策略）中可用，并且不适用于权限策略。

在 eduPerson 和 eduOrg 属性表中，值是以字符串或字符串列表的形式键入的。对于字符串值，您可以使用 `StringEquals` 或 `StringLike` 条件测试 IAM 信任策略中的这些值。对于包含字符串列表的值，您可以使用 `ForAnyValue` 和 `ForAllValues` [策略集运算符](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)测试信任策略中的这些值。

**注意**  
每个 Amazon 上下文密钥只能包含一个断言。如果包含多个声明，将仅映射其中一个。

下表显示 eduPerson 和 eduOrg 属性。


| eduPerson 或 eduOrg 属性（`Name` 密钥） | 映射至此 Amazon 上下文密钥（`FriendlyName` 密钥） | Type | 
| --- | --- | --- | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.1`   |   `eduPersonAffiliation`   |  字符串列表  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.2`   |   `eduPersonNickname`   |  字符串列表  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.3`   |   `eduPersonOrgDN`   |  字符串  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.4`   |   `eduPersonOrgUnitDN`   |  字符串列表  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.5`   |   `eduPersonPrimaryAffiliation`   |  字符串  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.6`   |   `eduPersonPrincipalName`   |  字符串  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.7`   |   `eduPersonEntitlement`   |  字符串列表  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.8`   |   `eduPersonPrimaryOrgUnitDN`   |  字符串  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.9`   |   `eduPersonScopedAffiliation`   |  字符串列表  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.10`   |   `eduPersonTargetedID`   |  字符串列表  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.11`   |   `eduPersonAssurance`   |  字符串列表  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.2.1.2`   |   `eduOrgHomePageURI`   |  字符串列表  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.2.1.3`   |   `eduOrgIdentityAuthNPolicyURI`   |  字符串列表  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.2.1.4`   |   `eduOrgLegalName`   |  字符串列表  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.2.1.5`   |   `eduOrgSuperiorURI`   |  字符串列表  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.2.1.6`   |   `eduOrgWhitePagesURI`   |  字符串列表  | 
|   `urn:oid:2.5.4.3`   |   `cn`   |  字符串列表  | 

下表显示 Active Directory 属性。


| AD 属性 | 映射到此 Amazon 上下文密钥 | Type | 
| --- | --- | --- | 
|  `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name`  |  `name`  |  字符串  | 
|  `http://schemas.xmlsoap.org/claims/CommonName`  |  `commonName`  |  字符串  | 
|  `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname`  |  `givenName`  |  字符串  | 
|  `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname`  |  `surname`  |  字符串  | 
|  `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`  |  `mail`  |  字符串  | 
|  `http://schemas.microsoft.com/ws/2008/06/identity/claims/primarygroupsid`  |  `uid`  |  字符串  | 

下表显示 X.500 属性。


| X.500 属性 | 映射到此 Amazon 上下文密钥 | Type | 
| --- | --- | --- | 
|  `2.5.4.3`  |  `commonName`  |  字符串  | 
|  `2.5.4.4`  |  `surname`  |  字符串  | 
|  `2.4.5.42`  |  `givenName`  |  字符串  | 
|  `2.5.4.45`  |  `x500UniqueIdentifier`  |  字符串  | 
|  `0.9.2342.19200300100.1.1`  |  `uid`  |  字符串  | 
|  `0.9.2342.19200300100.1.3`  |  `mail`  |  字符串  | 
|  `0.9.2342.19200300.100.1.45`  |  `organizationStatus`  |  字符串  | 

# 使 SAML 2.0 联合主体能够访问 Amazon Web Services 管理控制台
<a name="id_roles_providers_enable-console-saml"></a>

您可使用一个角色配置符合 SAML 2.0 标准的身份提供者（IdP）和 Amazon 以允许 SAML 联合主体访问 Amazon Web Services 管理控制台。该角色为用户授予了在控制台中执行任务的权限。如果您希望为 SAML 联合主体提供访问 Amazon 的其他方式，请参阅以下其中一项主题：
+ Amazon CLI: [切换到 IAM 角色（Amazon CLI）](id_roles_use_switch-role-cli.md)
+ Tools for Windows PowerShell: [切换到 IAM 角色（Tools for Windows PowerShell）](id_roles_use_switch-role-twp.md)
+ Amazon API：[切换到 IAM 角色（Amazon API）](id_roles_use_switch-role-api.md)

## 概述
<a name="enable-console-saml-overview"></a>

下图说明了启用了 SAML 的单一登录的流程。

**注意**  
SAML 的这种特定用途与[SAML 2.0 联合身份验证](id_roles_providers_saml.md)中所述的更常规的用途不同，因为此工作流程将代表用户打开 Amazon Web Services 管理控制台。这需要使用 Amazon 登录端点，而不是直接调用 `AssumeRoleWithSAML` API。该终端节点将为用户调用 API 并返回将用户的浏览器自动重定向到 Amazon Web Services 管理控制台的 URL。

![\[使用 SAML 单点登录 (SSO) 到 Amazon 管理控制台\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/images/saml-based-sso-to-console.diagram.png)


下图说明了以下步骤：

1. 用户浏览到您的组织的门户网站，并选择转到 Amazon Web Services 管理控制台的选项。在企业中，门户网站通常充当处理您企业与 Amazon 之间的信任交换的 IdP。例如，在 Active Directory 联合身份验证服务中，门户网站 URL 为：`https://ADFSServiceName/adfs/ls/IdpInitiatedSignOn.aspx`

1. 该门户网站可验证您的组织用户的身份。

1. 该门户网站生成一个 SAML 身份验证响应，其中包括识别用户身份的断言以及用户的相关属性。您也可以配置 IdP 以包含一个名为 `SessionDuration` 的 SAML 断言属性，该属性指定控制台会话的有效时间长度。您还可以配置 IdP，将属性作为[会话标签](id_session-tags.md)传递。该门户网站将此响应发送到客户端浏览器。

1. 该客户端浏览器将被重定向到 Amazon 单一登录终端节点并发布 SAML 断言。

1. 终端节点将代表用户请求临时安全凭证，并创建一个使用这些凭证的控制台登录 URL。

1. Amazon 将登录 URL 作为重定向发回客户端。

1. 该客户端浏览器将重定向到 Amazon Web Services 管理控制台。如果 SAML 身份验证响应包含映射到多个 IAM 角色的属性，则系统将首先提示用户选择角色以访问控制台。

从用户的角度来看，整个流程以透明的方式进行：用户在您的企业的内部门户网站开始操作，在 Amazon Web Services 管理控制台 结束操作，无需提供任何 Amazon 凭证。

有关如何配置此行为的概述以及指向详细步骤的链接，请参阅以下章节。

## 将网络配置为适用于 Amazon 的 SAML 提供商
<a name="fedconsole-config-network-as-saml"></a>

在组织的网络中，配置身份存储（例如 Windows Active Directory）以使用基于 SAML 的 IdP，例如 Windows Active Directory 联合身份验证服务、Shibboleth 等。通过使用 IdP，可以生成一个元数据文档，此文档将您的组织描述为 IdP 并且包含身份验证密钥。另外，还要将企业的门户网站配置为将访问 Amazon Web Services 管理控制台 的用户请求路由至 Amazon SAML 终端节点，以便使用 SAML 断言进行身份验证。如何配置您的 IdP 来生成 metadata.xml 文件取决于您的 IdP。请参阅您的 IdP 文档以获得指示，或参阅[将第三方 SAML 解决方案提供者与 Amazon 集成](id_roles_providers_saml_3rd-party.md)以获得指向很多支持的 SAML 提供商 Web 文档。

## 在 IAM 中创建 SAML 提供商
<a name="fedconsole-create-saml-provider"></a>

然后，登录 Amazon Web Services 管理控制台并转至 IAM 控制台。在此，您创建一个新的 SAML 提供商，这是在 IAM 中包含您的企业的 IdP 的相关信息的实体。在此过程中，您可以上传在上一节中由贵组织中的 IdP 软件生成的元数据文档。有关更多信息，请参阅 [在 IAM 中创建 SAML 身份提供者](id_roles_providers_create_saml.md)。

## 在 Amazon 中为 SAML 联合主体中配置权限
<a name="fedconsole-grantperms"></a>

下一步是创建一个 IAM 角色，以在 IAM 与您企业的 IdP 之间建立信任关系。该角色必须将您的 IdP 标识为主体（可信实体）以实现联合身份验证目的。该角色还定义了由您的组织的 IdP 进行身份验证的用户可以在 Amazon 中执行的操作。您可使用 IAM 控制台创建该角色。在创建指示谁可以代入角色的信任策略时，您可以将先前创建的 SAML 提供商指定为 IAM。您还可以指定用户要代入角色必须匹配的一个或多个 SAML 属性。例如，您可以指定只允许其 SAML `[eduPersonOrgDN](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#ck_edupersonorgdn)` 值为 `ExampleOrg` 的用户登录。角色向导会自动添加一个测试 `saml:aud` 属性的条件，以确保仅出于登录 Amazon Web Services 管理控制台的目的担任该角色。

如果需要 SAML 加密，则登录 URL 必须包含 Amazon 分配给您的 SAML 提供商的唯一标识符，您可以在身份提供者详细信息页面上找到该标识符。该角色的信任策略可能如下所示：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:saml-provider/ExampleOrgSSOProvider"
            },
            "Action": "sts:AssumeRoleWithSAML",
            "Condition": {
                "StringEquals": {
                    "saml:edupersonorgdn": "ExampleOrg",
                    "saml:aud": "https://region-code.signin.aws.amazon.com/saml/acs/SAMLSP4SHN3UIS2D558H46"
                }
            }
        }
    ]
}
```

------

**注意**  
角色信任策略中使用的 SAML IdP 必须与角色位于同一账户中。

我们建议使用区域端点作为 `https://region-code.signin.aws.amazon.com/static/saml-metadata.xml` 的 `saml:aud` 属性。有关可能的 *region-code* 值的列表，请参阅 [Amazon 登录端点](https://docs.amazonaws.cn/general/latest/gr/signin-service.html)中的 **Region**（区域）列。

对于该角色中的[权限策略](access_policies.md)，您可以像任何角色、用户或组一样指定权限。例如，如果允许您的企业中的用户管理 Amazon EC2 实例，您可以在权限策略中显式允许 Amazon EC2 操作。您可通过分配一个[托管策略](access_policies_manage-attach-detach.md) (如 **Amazon EC2 完全访问**托管策略) 执行此操作。

有关创建用于 SAML IdP 的角色的详细信息，请参阅[创建用于 SAML 2.0 联合身份验证的角色（控制台）](id_roles_create_for-idp_saml.md)。

## 完成配置并创建 SAML 断言
<a name="fedconsole-configassertions"></a>

通过安装位于 `https://region-code.signin.aws.amazon.com/static/saml-metadata.xml` 或 `https://signin.aws.amazon.com/static/saml-metadata.xml` 的 `saml-metadata.xml` 文件，通知 SAML IdP Amazon 是您的服务提供商。如果需要 SAML 加密，则可在 `https://region-code.signin.aws.amazon.com/static/saml/SAMLSP4SHN3UIS2D558H46/saml-metadata.xml` 找到该文件。

有关可能的 *region-code* 值的列表，请参阅 [Amazon 登录端点](https://docs.amazonaws.cn/general/latest/gr/signin-service.html)中的 **Region**（区域）列。

安装该文件的方式取决于您的 IdP。一些提供商为您提供了键入该 URL 的选项，此时，IdP 将为您获取并安装该文件。另一些提供商则要求您从该 URL 处下载该文件，然后将其作为本地文件提供。请参阅您的 IdP 文档以获得详细信息或参阅[将第三方 SAML 解决方案提供者与 Amazon 集成](id_roles_providers_saml_3rd-party.md)以获得指向很多支持的 SAML 提供商的 Web 文档。

您还可配置一条信息，您希望 IdP 在身份验证响应期间将此信息作为 SAML 属性传递到 Amazon。这些信息的大部分在 Amazon 中显示为条件上下文密钥，您可以在策略中进行评估。这些条件键确保仅向正确上下文中的授权用户授予权限来访问您的 Amazon 资源。您可以指定限制何时可使用控制台的时段。您还可以指定在必须刷新用户的凭证之前用户可访问控制台的最长时间（最多 12 个小时）。有关详细信息，请参阅[为身份验证响应配置 SAML 断言。](id_roles_providers_create_saml_assertions.md)。

# 在您的浏览器中查看 SAML 响应
<a name="troubleshoot_saml_view-saml-response"></a>

以下过程介绍了在排除 SAML 2.0 相关问题时，如何在浏览器中查看服务提供商的 SAML 响应。

对于所有浏览器，请转到您可以重现问题的页面。然后，针对相应的浏览器执行以下步骤：

**Topics**
+ [

## Google Chrome
](#chrome)
+ [

## Mozilla Firefox
](#firefox)
+ [

## Apple Safari
](#safari)
+ [

## 如何处理 Base64 编码的 SAML 响应
](#whatnext)

## Google Chrome
<a name="chrome"></a>

**在 Chrome 中查看 SAML 响应**

这些步骤已经过 Google Chrome 版本 106.0.5249.103（官方版本）（arm64）的测试。如果您使用其他版本，则可能需要相应地调整步骤。

1. 按 **F12** 以启动 **Developer Tools**（开发人员工具）控制台。

1. 选择 **Network**（网络）选项卡，然后选择 **Developer Tools**（开发人员工具）窗口左上角的 **Preserve log**（保留日志）。

1. 重现问题。

1. （可选）如果 **Method**（方法）列在 **Developer Tools**（开发人员工具）的 **Network**（网络）日志窗格中不可见，右击任何列标签并选择 **Method**（方法）以添加列。

1. 在 **Developer Tools**（开发人员工具）的 **Network**（网络）日志窗格中查找 **SAML Post**。选择该行，然后查看顶部的 **Payload**（有效负载）选项卡。查找包含编码请求的 **SAMLResponse** 元素。关联值为 Base64 编码的响应。

## Mozilla Firefox
<a name="firefox"></a>

**在 Firefox 中查看 SAML 响应**

此过程已在 Mozilla Firefox 版本 105.0.3（64 位）上进行了测试。如果您使用其他版本，则可能需要相应地调整步骤。

1. 按 **F12** 以启动 **Web Developer Tools**（Web 开发人员工具）控制台。

1. 选择 **Network** 选项卡。

1. 在 **Web Developer Tools**（Web 开发人员工具）窗口的右上角，选择选项（小齿轮图标）。选择 **Persist logs**（保留日志）。

1. 重现问题。

1. （可选）如果 **Method**（方法）列在 **Web 开发人员工具**的 **Network**（网络）日志窗格中不可见，右击任何列标签并选择 **Method**（方法）以添加列。

1. 在表中查找 **POST** **SAML**。选择该行，然后查看 **Request**（请求）选项卡并找到 **SAMLResponse** 元素。关联值为 Base64 编码的响应。

## Apple Safari
<a name="safari"></a>

**在 Safari 中查看 SAML 响应**

这些步骤已经过 Apple Safari 版本 16.0（17614.1.25.9.10、17614）的测试。如果您使用其他版本，则可能需要相应地调整步骤。

1. 在 Safari 中启用 Web Inspector。打开 **Preferences** 窗口，选择 **Advanced** 选项卡，然后选择 **Show Develop menu in the menu bar**。

1. 现在您可以打开 Web Inspector。在菜单栏中选择 **Develop**（开发），然后选择 **Show Web Inspector**（显示 Web 检查器）。

1. 选择 **Network** 选项卡。

1. 在 **Web Inspector**（Web 检查器）窗口的左上角，选择选项（包含三条横线的小圆圈图标）。选择 **Preserve Log**（保留日志）。

1. （可选）如果 **Method**（方法）列在 **Web Inspector**（Web 检查器）的**Network**（网络）日志窗格中不可见，右击任何列标签并选择 **Method**（方法）以添加列。

1. 重现问题。

1. 在表中查找 **POST** **SAML**。选择该行，然后查看 Headers（标头）选项卡。

1. 查找包含编码请求的 **SAMLResponse** 元素。向下滚动，查找名为 `Request Data` 的 `SAMLResponse`。关联值为 Base64 编码的响应。

## 如何处理 Base64 编码的 SAML 响应
<a name="whatnext"></a>

在浏览器中找到 Base64 编码的 SAML 响应元素之后，复制这些元素并使用您偏好的 Base-64 解码工具来提取带有 XML 标签的响应。

**安全提示**  
由于您查看的 SAML 响应数据可能包含敏感安全数据，我们建议您不要使用*在线* base64 解码程序。而是使用安装在本地计算机上、不会通过网络发送 SAML 数据的工具。

**适用于 Windows 系统的内置选项 (PowerShell)：**

```
PS C:\> [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("base64encodedtext"))
```

**适用于 MacOS 和 Linux 系统的内置选项：**

```
$ echo "base64encodedtext" | base64 --decode
```

**查看解码后的文件中的值**  
查看解码后的 SAML 响应文件中的值。
+ 验证 saml:NameID 属性的值是否与经过身份验证的用户的用户名匹配。
+ 查看 https://aws.amazon.com/SAML/Attributes/Role 的值。ARN 和 SAML 提供商区分大小写，并且 [ARN](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference-arns.html) 必须与您账户中的资源匹配。
+ 查看 https://aws.amazon.com/SAML/Attributes/RoleSessionName 的值。该值必须与[声明规则](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html)中的值匹配。
+ 如果为电子邮件地址或账户名配置了属性值，请确保这些值正确无误。这些值必须与经过身份验证的用户的电子邮件地址或账户名相对应。

**检查是否有错并确认配置**  
检查这些值是否包含错误，并确认下面的配置是否正确。
+ 声明规则符合要求的要素，并且所有 ARN 都正确无误。有关更多信息，请参阅 [配置具有依赖方信任的 SAML 2.0 IdP 并添加陈述](id_roles_providers_create_saml_relying-party.md)。
+ 您已将最新元数据文件从 IdP 上传到 SAML 提供商中的 Amazon。有关更多信息，请参阅 [使 SAML 2.0 联合主体能够访问 Amazon Web Services 管理控制台](id_roles_providers_enable-console-saml.md)。
+ 您正确配置了 IAM 角色的信任策略。有关更多信息，请参阅 [担任角色的方法](id_roles_manage-assume.md)。