使用 Web 联合身份验证识别用户的身份 - Amazon Identity and Access Management
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Web 联合身份验证识别用户的身份

在 IAM 中创建访问策略时,可根据所配置的应用程序和根据已使用外部身份提供程序 (IdP) 进行身份验证的用户的 ID 指定权限,这一点通常很有用。举例来说,使用 Web 联合身份验证的移动应用程序可能按类似于如下形式的结构将信息保留在 Amazon S3 中:

myBucket/app1/user1 myBucket/app1/user2 myBucket/app1/user3 ... myBucket/app2/user1 myBucket/app2/user2 myBucket/app2/user3 ...

可能还要按提供商区分这些路径。在这种情况下,结构可能类似于如下形式 (为节省空间,仅列出了两个提供商):

myBucket/Amazon/app1/user1 myBucket/Amazon/app1/user2 myBucket/Amazon/app1/user3 ... myBucket/Amazon/app2/user1 myBucket/Amazon/app2/user2 myBucket/Amazon/app2/user3 myBucket/Facebook/app1/user1 myBucket/Facebook/app1/user2 myBucket/Facebook/app1/user3 ... myBucket/Facebook/app2/user1 myBucket/Facebook/app2/user2 myBucket/Facebook/app2/user3 ...

在这些结构中,app1app2 表示不同的应用程序 (如不同的游戏),并且每个应用程序用户都有一个不同的文件夹。app1app2 的值可能是您分配的易记名称 (例如 mynumbersgame),也可能是在配置应用程序时提供商分配的应用程序 ID。如果决定在路径中加入提供商名称,则这些名称也可以是易记的名称,如 CognitoAmazonFacebookGoogle

由于应用程序名称为静态值,因此您可以通过 Amazon Web Services Management Console创建 app1app2 的文件夹。如果在路径中加入提供商名称,则同样如此,因为提供商名称也是静态值。相比之下,用户特定的文件夹(user1user2user3 等)必须使用通过请求 AssumeRoleWithWebIdentity 而返回的 SubjectFromWebIdentityToken 值中提供的用户 ID,在运行时从应用程序中创建。

要编写策略以允许独占访问个别用户的资源,可搭配文件夹全名,其中包括应用程序名称和提供商名称 (如果使用这两项)。然后,可包含以下提供商特定的上下文密钥,其中引用提供商返回的用户 ID:

  • cognito-identity.amazonaws.com:sub

  • www.amazon.com:user_id

  • graph.facebook.com:id

  • accounts.google.com:sub

对于 OIDC 提供商,请将 OIDC 提供商的完全限定 URL 与子上下文密钥一起使用,如以下示例所示:

  • server.example.com:sub

以下示例说明了一个权限策略,只有在 Amazon S3 中的存储桶前缀与以下字符串匹配时,该策略才会为该存储桶授予访问权限:

myBucket/Amazon/mynumbersgame/user1

该示例假定用户使用 Login with Amazon 登录并正在使用一个名为 mynumbersgame 的应用程序。用户的唯一 ID 以名为 user_id 的属性表示。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::myBucket"], "Condition": {"StringLike": {"s3:prefix": ["Amazon/mynumbersgame/${www.amazon.com:user_id}/*"]}} }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::myBucket/amazon/mynumbersgame/${www.amazon.com:user_id}", "arn:aws:s3:::myBucket/amazon/mynumbersgame/${www.amazon.com:user_id}/*" ] } ] }

您可以为使用 Amazon Cognito、Facebook、Google 或其他 OpenID Connect 兼容的 IdP 登录的用户创建类似的策略。这些策略将使用不同的提供商名称作为路径的一部分,并将使用不同的应用程序 ID。

有关可用于策略中的条件检查的 Web 联合身份验证密钥的更多信息,请参阅Amazon Web 联合身份验证的可用键