Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

使用联合用户临时凭证创建请求 - 适用于 .NET 的 AWS 开发工具包

您可以为联合用户和应用程序提供临时安全凭证 (参阅 创建请求),以便他们可以发送经身份验证的请求,从而访问您的 AWS 资源。请求这些临时凭证时,您必须提供用户名称和 IAM 策略 (描述您需要授予的资源权限)。默认情况下,会话的持续时间为一个小时。您可以在为联合用户和应用程序请求临时安全凭证时,显式地设置其他持续时间值。

注意

为了请求适用于联合用户和应用程序的临时安全凭证,出于提高安全性的考虑,您可能需要使用仅具有所需访问权限的专用 IAM 用户。您创建的临时用户可获取的权限不能超过请求临时安全凭证的 IAM 用户。有关更多信息,请参阅 AWS Identity and Access Management 常见问题

使用联合用户临时凭证创建请求

1

创建 AWS Security Token Service客户端 AmazonSecurityTokenServiceClient 类的实例。有关提供凭证的信息,请参阅使用 适用于 .NET 的 AWS 开发工具包

2

通过调用 STS 客户端的 GetFederationToken 方法开始会话。

您将需要提供会话信息,包括要附加到临时凭证的用户名称和 IAM 策略。您可以提供可选的会话持续时间。

此方法将返回您的临时安全凭证。

3

将临时安全凭证打包在 SessionAWSCredentials 对象的实例中。您可以使用此对象向您的 Amazon S3 客户端提供临时安全凭证。

4

通过传递临时安全凭证创建 AmazonS3Client 类的实例。

可使用此客户端向 Amazon S3 发送请求。如果您使用过期的凭证发送请求, Amazon S3 将返回错误。

以下 C# 代码示例演示了上述任务。

Copy
// In real applications, the following code is part of your trusted code. It has // your security credentials you use to obtain temporary security credentials. AmazonSecurityTokenServiceConfig config = new AmazonSecurityTokenServiceConfig(); AmazonSecurityTokenServiceClient stsClient = new AmazonSecurityTokenServiceClient(config); GetFederationTokenRequest federationTokenRequest = new GetFederationTokenRequest(); federationTokenRequest.Name = "User1"; federationTokenRequest.Policy = "*** Specify policy ***"; federationTokenRequest.DurationSeconds = 7200; GetFederationTokenResponse federationTokenResponse = stsClient.GetFederationToken(federationTokenRequest); GetFederationTokenResult federationTokenResult = federationTokenResponse.GetFederationTokenResult; Credentials credentials = federationTokenResult.Credentials; SessionAWSCredentials sessionCredentials = new SessionAWSCredentials(credentials.AccessKeyId, credentials.SecretAccessKey, credentials.SessionToken); // The following will be part of your less trusted code. You provide temporary security // credentials so it can send authenticated requests to Amazon S3. // Create Amazon S3 client by passing in the basicSessionCredentials object. AmazonS3Client s3Client = new AmazonS3Client(sessionCredentials); // Test. For example, send list object keys in a bucket. ListObjectsRequest listObjectRequest = new ListObjectsRequest(); listObjectRequest.BucketName = bucketName; ListObjectsResponse response = s3Client.ListObjects(listObjectRequest);

以下 C# 代码示例列出了特定存储桶中的密钥。在代码示例中,对于时长两个小时的会话,您可以首先获取适用于联合用户 (User1) 的临时安全凭证,然后使用它们向 Amazon S3 发送经身份验证的请求。

请求适用于其他人的临时凭证时,出于提高安全性的考虑,您可以使用 IAM 用户 (该用户拥有请求临时安全凭证的权限) 的安全凭证。您也可以限制此 IAM 用户的访问权限,以确保 IAM 用户仅向联合用户授予特定于应用程序的最小权限。此示例仅会列出特定存储桶中的对象。因此,首先创建附加了以下策略的 IAM 用户。

Copy
{ "Statement":[{ "Action":["s3:ListBucket", "sts:GetFederationToken*" ], "Effect":"Allow", "Resource":"*" } ] }

该策略允许 IAM 用户请求临时安全凭证和用于仅列出 AWS 资源的访问权限。有关如何创建 IAM 用户的更多信息,请参阅 IAM 用户指南 中的创建您的第一个 IAM 用户和管理员组

您现在可以使用 IAM 用户安全凭证测试下面的示例。该示例将使用临时安全凭证向 Amazon S3 发送经身份验证的请求。该示例在为联合用户 (User1) 请求临时安全凭证时指定了以下策略,该策略对列出特定存储桶 (YourBucketName) 中的对象设置了访问权限限制。您必须更新策略并提供您自己的现有存储桶名称。

Copy
{ "Statement":[ { "Sid":"1", "Action":["s3:ListBucket"], "Effect":"Allow", "Resource":"arn:aws-cn:s3:::YourBucketName" } ] }

您必须更新下面的示例并提供您在前面的联合用户访问策略中指定的存储桶名称。有关如何创建和测试有效示例的说明,请参阅运行 Amazon S3 .NET 代码示例

Copy
using System; using System.Configuration; using System.Collections.Specialized; using Amazon.S3; using Amazon.SecurityToken; using Amazon.SecurityToken.Model; using Amazon.Runtime; using Amazon.S3.Model; using System.Collections.Generic; namespace s3.amazon.com.docsamples { class TempFederatedCredentials { static string bucketName = "*** Provide bucket name ***"; static IAmazonS3 client; public static void Main(string[] args) { NameValueCollection appConfig = ConfigurationManager.AppSettings; string accessKeyID = appConfig["AWSAccessKey"]; string secretAccessKeyID = appConfig["AWSSecretKey"]; try { Console.WriteLine("Listing objects stored in a bucket"); SessionAWSCredentials tempCredentials = GetTemporaryFederatedCredentials(accessKeyID, secretAccessKeyID); // Create client by providing temporary security credentials. using (client = new AmazonS3Client(tempCredentials, Amazon.RegionEndpoint.USEast1)) { ListObjectsRequest listObjectRequest = new ListObjectsRequest(); listObjectRequest.BucketName = bucketName; ListObjectsResponse response = client.ListObjects(listObjectRequest); List<S3Object> objects = response.S3Objects; Console.WriteLine("Object count = {0}", objects.Count); Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } } catch (AmazonS3Exception s3Exception) { Console.WriteLine(s3Exception.Message, s3Exception.InnerException); } catch (AmazonSecurityTokenServiceException stsException) { Console.WriteLine(stsException.Message, stsException.InnerException); } } private static SessionAWSCredentials GetTemporaryFederatedCredentials( string accessKeyId, string secretAccessKeyId) { AmazonSecurityTokenServiceConfig config = new AmazonSecurityTokenServiceConfig(); AmazonSecurityTokenServiceClient stsClient = new AmazonSecurityTokenServiceClient( accessKeyId, secretAccessKeyId, config); GetFederationTokenRequest federationTokenRequest = new GetFederationTokenRequest(); federationTokenRequest.DurationSeconds = 7200; federationTokenRequest.Name = "User1"; federationTokenRequest.Policy = @"{ ""Statement"": [ { ""Sid"":""Stmt1311212314284"", ""Action"":[""s3:ListBucket""], ""Effect"":""Allow"", ""Resource"":""arn:aws:s3:::YourBucketName"" } ] } "; GetFederationTokenResponse federationTokenResponse = stsClient.GetFederationToken(federationTokenRequest); Credentials credentials = federationTokenResponse.Credentials; SessionAWSCredentials sessionCredentials = new SessionAWSCredentials(credentials.AccessKeyId, credentials.SecretAccessKey, credentials.SessionToken); return sessionCredentials; } } }

相关资源

本页内容: