Amazon Simple Storage Service
开发人员指南 (API 版本 2006-03-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

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

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

注意

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

您应当执行以下操作:

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

  • 通过调用 STS 客户端的 GetFederationToken 方法开始会话。您需要提供会话信息,包括要附加到临时凭证的用户名和 IAM 策略。(可选) 您可以提供会话持续时间。 此方法将返回您的临时安全凭证。

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

  • 通过传递临时安全凭证创建 AmazonS3Client 类的实例。您可使用此客户端向 Amazon S3 发送请求。如果您使用过期的凭证发送请求, Amazon S3 将返回错误。

以下 C# 示例列出了指定存储桶中的密钥。在此示例中,将为联合身份用户 (User1) 的时长两个小时的会话获取临时安全凭证,然后使用这些凭证向 Amazon S3 发送经身份验证的请求。

  • 在此练习中,您将创建具有最低权限的 IAM 用户。通过使用此 IAM 用户的凭证,可为其他用户请求临时凭证。此示例仅列出特定存储桶中的对象。创建附加了以下策略的 IAM 用户:

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

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

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

    { "Statement":[ { "Sid":"1", "Action":["s3:ListBucket"], "Effect":"Allow", "Resource":"arn:aws-cn:s3:::YourBucketName" } ] }
  • 更新以下示例并提供在前面的联合身份用户访问策略中指定的存储桶名称。有关如何创建和测试有效示例的说明,请参阅运行 Amazon S3 .NET 代码示例

    // Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-s3-developer-guide/blob/master/LICENSE-SAMPLECODE.) using Amazon.Runtime; using Amazon.S3; using Amazon.S3.Model; using Amazon.SecurityToken; using Amazon.SecurityToken.Model; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class TempFederatedCredentialsTest { private const string bucketName = "*** bucket name ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { ListObjectsAsync().Wait(); } private static async Task ListObjectsAsync() { try { Console.WriteLine("Listing objects stored in a bucket"); // Credentials use the default AWS SDK for .NET credential search chain. // On local development machines, this is your default profile. SessionAWSCredentials tempCredentials = await GetTemporaryFederatedCredentialsAsync(); // Create a client by providing temporary security credentials. using (client = new AmazonS3Client(bucketRegion)) { ListObjectsRequest listObjectRequest = new ListObjectsRequest(); listObjectRequest.BucketName = bucketName; ListObjectsResponse response = await client.ListObjectsAsync(listObjectRequest); List<S3Object> objects = response.S3Objects; Console.WriteLine("Object count = {0}", objects.Count); Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } private static async Task<SessionAWSCredentials> GetTemporaryFederatedCredentialsAsync() { AmazonSecurityTokenServiceConfig config = new AmazonSecurityTokenServiceConfig(); AmazonSecurityTokenServiceClient stsClient = new AmazonSecurityTokenServiceClient( 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:::" + bucketName + @""" } ] } "; GetFederationTokenResponse federationTokenResponse = await stsClient.GetFederationTokenAsync(federationTokenRequest); Credentials credentials = federationTokenResponse.Credentials; SessionAWSCredentials sessionCredentials = new SessionAWSCredentials(credentials.AccessKeyId, credentials.SecretAccessKey, credentials.SessionToken); return sessionCredentials; } } }

相关资源

本页内容: