【问题标题】:ASP.NET Core 2 Web API AWS .NET SDK S3 Access DeniedASP.NET Core 2 Web API AWS .NET SDK S3 访问被拒绝
【发布时间】:2018-08-21 00:38:59
【问题描述】:

我正在 Windows 笔记本电脑上使用 .NET Core 2 开发 Web api。我正在尝试访问我的 S3 存储桶并收到拒绝访问错误。

有趣的是它可以与 AWS CLI 一起使用。

我的 appSettings.Development.json 文件:

"AWS": {
    "Profile": "my-profile",
    "Region": "us-east-1"
 }

Startup.cs 文件:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    var options = Configuration.GetAWSOptions();
    services.AddDefaultAWSOptions(Configuration.GetAWSOptions());
    services.AddAWSService<IAmazonS3>();
}

BucketController.cs 文件:

public async Task<IEnumerable<string>> Get()
{
    // List all objects
    ListObjectsRequest listRequest = new ListObjectsRequest
    {
        BucketName = "shel-bucket"
    };

    ListObjectsResponse listResponse;
    do
    {
        // Get a list of objects
        listResponse = await _client.ListObjectsAsync(listRequest);
        foreach (S3Object obj in listResponse.S3Objects)
        {
            Console.WriteLine("Object - " + obj.Key);
            Console.WriteLine(" Size - " + obj.Size);
            Console.WriteLine(" LastModified - " + obj.LastModified);
            Console.WriteLine(" Storage class - " + obj.StorageClass);
        }

        // Set the marker property
        listRequest.Marker = listResponse.NextMarker;
    } while (listResponse.IsTruncated);

    return null;
}

我得到的错误是 AmazonS3Exception: Access Denied。

当我从 AWS CLI 执行此操作时,它可以工作。

aws --profile my-profile s3 ls shel-bucket
                              PRE test1/
                              PRE images/
                              PRE projects/
                              PRE test4/

我的凭据和配置文件位于 .aws 中的默认位置。

【问题讨论】:

  • 是公共存储桶还是私有存储桶?
  • 您是否尝试过在配置文件中使用您的访问密钥和秘密来查看配置文件是否未正确导入?你的桶在 us-east-1 吗?
  • @tura08 - 这是私人的
  • 你是如何提供你的 accessKey/secretKey 的?
  • @programmerj 所以我最终在代码本身中硬编码凭据并且工作正常。

标签: .net amazon-s3 asp.net-core aws-sdk aws-sdk-net


【解决方案1】:

在您的代码中,尝试将您的 Startup 替换为:

public void ConfigureServices(IServiceCollection services)
{
        services.AddMvc();
        services.AddSingleton<IS3Service, S3Service>();
        services.AddAWSService<IAmazonS3>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc();
}

你首先需要安装在Package Manager Console:

`Install-package AWSSDK.Extensions.NETCORE.Setup`

`Install-package AWSSDK.S3`

那么你需要在目录中有凭证文件:

`C:\Users\username\.aws\credentials`

凭证文件应具有以下格式:

[default]
aws_access_key_id=[Write your access key in here]
aws_secret_access_key=[Write your secret access key in here]
region=[Write your region here]

我在github 中上传了一个用于 S3 存储桶的 ASP.NET CORE 中的基本 CRUD 示例。

【讨论】:

    【解决方案2】:

    检查您帐户中的文件写入/读取权限或通过编码尝试此操作

    CannedACL = S3CannedACL.BucketOwnerFullControl
    

    当我遇到同样的问题时,它解决了我的问题。

    【讨论】:

      【解决方案3】:
      1. 我已经通过以下步骤解决了
      2. 转到 AWS IAM 服务
      3. 选择用户
      4. 点击添加权限
      5. 授予对 S3 的访问权限并立即尝试。

      【讨论】:

        【解决方案4】:

        我尝试了所有这些,并且在部署到 AWS Lambda 时它可以工作,但在我的本地环境中从未工作过。我通过自己创建一个新的 S3Client 而不是注入它来解决它:

        var S3Client = new AmazonS3Client(Amazon.RegionEndpoint.USWest2);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-30
          • 1970-01-01
          • 1970-01-01
          • 2015-09-22
          • 2020-08-09
          • 1970-01-01
          • 1970-01-01
          • 2019-02-03
          相关资源
          最近更新 更多