AWS:Amazon Cognito 与 STS 和 SAML

AWS: Amazon Cognito vs STS and SAML

在官方 AWS documentation 关于 Cognito 的一个用例大纲中指出:

1.In the first step your app user signs in through a user pool and receives user pool tokens after a successful authentication.

2.Next, your app exchanges the user pool tokens for AWS credentials through an identity pool.

3.Finally, your app user can then use those AWS credentials to access other AWS services such as Amazon S3 or DynamoDB.

通过STS实现的token分配"AWS Credentials"的目的不是吗?

Cognito 和 STS 在授予非 AWS 用户访问 AWS 服务(例如 S3 或 EC2)的范围方面究竟有何不同?

同一文档来源还指出,Cognito 也适用于 AWS 与第三方身份提供商(例如社交 - 例如 Facebook - 或 AD 公司)之间的身份联合。

这不也是通过 SAML 联盟实现的(即让 AWS 和 IdP 首先建立基于 SAML 的信任关系吗?)

Cognito 用户池和身份池是 higher-level 比 SAML 和 STS 抽象的。让我们从定义什么是 SAML 和 STS 开始:

SAML makes single sign-on (SSO) technology possible by providing a way to authenticate a user once and then communicate that authentication to multiple applications.

STS is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users or for users that you authenticate

基本上,SAML 是一种将一个应用程序生成的身份验证令牌传输到另一个应用程序的方法,STS 是一种从 AWS 获取授权令牌(即 AWS 凭证)的方法。

现在,另一方面,我们有 Cognito 用户和身份池:

用户池提供身份验证,如 SAML,但它们提供用户数据库。 SAML 不会这样做,所以如果您想保留用户数据、添加、更改等,您需要自己做。 SAML 允许您做的就是将这些用户的身份验证卸载给另一方。不过,您必须编写所有代码才能进行身份验证。

用户池可以自己使用 SAML 身份验证提供程序,或进行自己的 built-in 身份验证。但无论哪种情况,您最终都会得到一个位于 Cognito 中并具有与之关联的数据的用户实体。

Identity Pools 提供授权,即决定允许(通常经过身份验证,但并非总是)用户执行的操作。他们确实在后台使用 STS,以获取启用特定操作的令牌,但身份池会根据用户特征选择是否授予凭据以及授予哪些凭据。身份池依赖身份验证提供程序来确定用户是谁;该提供者也可以是用户池或 SAML 提供者。身份池将自动检查 给定的身份验证令牌,根据提供者,它们是有效的,并且它们允许用户获得某些授权令牌。

总而言之,Cognito 用户池和 Cognito 身份池封装了您通常需要自己编写的功能,以便从 SAML 提供程序到用户数据库再到映射用户有权检索这些权限的 AWS 凭证。无需对 SAML 提供程序进行身份验证调用(或实现您自己的身份验证)、实现用户数据库,然后为用户权限创建 AWS 凭证,它们允许您配置用户池以使用给定的提供程序(或 Cognito 自己的身份验证) ), 将一个身份池指向用户池,并告诉身份池用户池的成员应该有什么权限。其余的都在后台为您完成。