本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Web 联合身份验证
如果您在为大量用户编写应用程序,可以选择使用 Web 联合身份验证 进行身份验证和授权。Web 联合身份验证使您无需创建单个 IAM 用户。相反,用户可以登录到身份提供程序,然后从 AWS Security Token Service (AWS STS) 获取临时安全凭证。然后,应用程序可以使用这些证书访问 AWS 服务。
Web 联合身份验证支持以下身份提供商:
-
Login with Amazon
-
Facebook
-
Google
有关 Web 联合身份验证的其他资源
以下资源可帮助您详细了解 Web 联合身份验证:
-
AWS 开发人员博客上的文章使用适用于 .NET 的 AWS 开发工具包的 Web 联合身份验证
分步介绍了如何对 Facebook 使用 Web 联合身份验证。其中包含 C# 代码片段,这些代码片段演示了如何使用 Web 身份代入 IAM 角色,以及如何使用临时安全凭证访问 AWS 资源。 -
适用于 iOS 的 AWS 开发工具包
和适用于 Android 的 AWS 开发工具包 含有示例应用程序。这些应用程序中包括的代码演示了如何调用身份提供商,然后如何使用这些提供商提供的信息获得和使用临时安全凭证。 -
移动应用程序的 Web 联合身份验证
一文讨论 Web 联合身份验证,并给出一个示例,演示如何使用 Web 联合身份验证访问 AWS 资源。
Web 联合身份验证的示例策略
要显示如何将 Web 联合身份验证与 DynamoDB 结合使用,请重新访问中介绍的 GameScores使用 IAM 策略条件实现精细访问控制 表。以下是 GameScores 的主键。
表名称 | 主键类型 | 分区键名称和类型 | 排序键名称和类型 |
---|---|---|---|
GameScores (UserId, GameTitle, ...) | 复合键 | 属性名称:UserId 类型: 字符串 | 属性名称:GameTitle 类型: 字符串 |
现在假设移动游戏应用程序使用该表,并且此应用程序需要支持数千甚至数百万用户。在这种规模下,管理单个应用程序用户并保证每个用户只能访问 GameScores 表中自己的数据将变得非常困难。幸运的是,许多用户已有某个第三方身份提供商(如 Facebook、Google 或 Login with Amazon)的账户。因此,可以利用这些提供商之一执行身份验证任务。
使用 Web 联合身份验证执行此操作,应用程序开发人员必须向身份识别提供商注册此应用程序(如 Login with Amazon)并获取唯一应用程序 ID。然后,开发人员需要创建一个 IAM 角色。(对于本示例,此角色名为 GameRole。) 该角色必须附加有 IAM 策略文档,并指定应用程序可访问 GameScores 表的条件。
当用户想要玩游戏时,他可从游戏应用程序登录其 Login with Amazon 账户。然后,该应用程序调用 AWS Security Token Service (AWS STS),从而在 GameRole 中提供 Login with Amazon 应用程序 ID 和请求成员资格。AWS STS 向应用程序返回临时 AWS 凭证,并允许应用程序访问 GameScores 表,具体取决于 GameRole 策略文档。
下图显示了这些部分是如何组合到一起的。

Web 联合身份验证概览
-
应用程序调用第三方身份提供商对用户和应用程序进行身份验证。身份提供商会返回 Web 身份验证令牌到应用程序。
-
应用程序调用 AWS STS 并将 Web 身份验证令牌作为输入传递。AWS STS 授权应用程序并授予其临时 AWS 访问凭证。应用程序可以代入 IAM 角色 (GameRole) 并根据该角色的安全策略访问 AWS 资源。
-
应用程序调用 DynamoDB 以访问 GameScores 表。因为它已担任 GameRole,应用程序受与该角色关联的安全策略的约束。策略文档可防止用户访问不属于自己的数据。
同样,以下是 GameRole 的安全策略,如 使用 IAM 策略条件实现精细访问控制 中所示:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToOnlyItemsMatchingUserID", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [ "${www.amazon.com:user_id}" ], "dynamodb:Attributes": [ "UserId", "GameTitle", "Wins", "Losses", "TopScore", "TopScoreDateTime" ] }, "StringEqualsIfExists": { "dynamodb:Select": "SPECIFIC_ATTRIBUTES" } } } ] }
子句确定 Condition
GameScores 中的哪些项目对应用程序可见。它通过比较 Login with Amazon ID 与 UserId
中的 GameScores
分区键值来执行此操作。 只有属于当前用户的项目才能使用此策略中列出的 DynamoDB 操作之一进行处理。该表中的其他项目均不可访问 此外,只有策略中列示的特定属性方予访问。