【问题标题】:Accessing AWS S3 bucket from asp.net mvc application give 403 error从 asp.net mvc 应用程序访问 AWS S3 存储桶会出现 403 错误
【发布时间】:2017-08-30 04:33:22
【问题描述】:

我对 Amazon AWS 平台还很陌生。

我的实现场景是这样的,我需要一个具有公共读取权限的 S3 存储桶来存储用户的个人资料图片和其他静态图片,用于网站的徽标和背景。该应用程序的用户可以上传个人资料图片。

当我尝试访问此 S3 存储桶时,出现 403 禁止错误。

我通过阅读一些博客完成了以下操作,但不确定我到底哪里出错了。

第 1 步:为具有公共读取访问权限的 US-EAST-2 区域(与 EC2 实例相同的区域)创建一个名为“test.domain.com”的 S3 bucked。

第 2 步:使用以下配置创建策略

    {
        "Effect": "Allow",
        "Action": [
            "s3:ListAllMyBuckets"
        ],
        "Resource": [
            "arn:aws:s3:::*"
        ]
    },
    {
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject",
            "s3:ListObject"
        ],
        "Resource": [
            "arn:aws:s3:::test.domain.com/*"
        ]
    }

第 3 步:为 Amazon EC2 创建一个新角色并附加上面创建的策略。

第 4 步:将新创建的角色附加到 EC2 实例

步骤 5:使用 VS2015 自带的预定义模板创建一个 MVC 应用程序,通过 nuget 包管理器安装 Amazon AWSSDK 并编写以下代码以查看是否一切正常。

   //getting instanceprofilecredentials
   var profile = new InstanceProfileAWSCredentials();

   //creating s3 client with credentials and region
   var s3= new AmazonS3Client(profile, Amazon.RegionEndpoint.USEast2);

   //creating a new request and assigning bucket name
   var request = new ListObjectsRequest();
   request.BucketName = "test.domain.com";

   //sending the request
   var response = s3.ListObjects(request);

   //counting no of existing objects
   int totalObjects=response.S3Objects.Count;

   //display as controllers action result
   return Content(totalObjects)

第 6 步:使用 VS2015 的 web deploy 部署应用程序。

任何帮助都将不胜感激。谢谢。

【问题讨论】:

标签: asp.net asp.net-mvc amazon-web-services amazon-s3 amazon-ec2


【解决方案1】:

我认为你需要add the Principal element to your bucket policy。我在下面添加到您的代码中的行将允许所有人访问。

 {
        "Effect": "Allow",
        "Action": [
            "s3:ListAllMyBuckets"
        ],
        "Resource": [
            "arn:aws:s3:::*"
        ]
    },
    {
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject",
            "s3:ListObject"
        ],
        "Resource": [
            "arn:aws:s3:::test.domain.com/*"
        ]
    }

【讨论】:

  • 添加主体时,策略验证抛出错误为“无效主体”。如果我在没有使用 aws policy sim 的原理的情况下测试策略,它工作得非常好。但是如果我从我的 .net 代码运行相同的策略,它会引发错误。
【解决方案2】:

添加以下策略规则以允许基于角色的访问已解决此问题

     {
        "Sid": "AllowPassRole",
        "Effect": "Allow",
        "Action": [
            "iam:PassRole",
            "iam:ListInstanceProfiles"
        ],
        "Resource": "*"
    }

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 2016-08-23
    • 2019-04-18
    • 2016-03-07
    • 2020-06-15
    • 1970-01-01
    • 2017-05-06
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多