Amazon S3:GetObject请求抛出异常"访问被拒绝" 403

时间:2015-08-07 07:46:37

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

我刚刚开始在我的ASP.NET项目中使用Amazon S3。我可以上传图片,删除它们,并在浏览器上显示。但是当我试图通过一个简单的GetObjectRequest从代码隐藏中获取图像对象来将其加载到一个简单的流时,我得到了一个例外并且#34;访问被拒绝:远程服务器返回了一个错误:(403 )禁止。"。而且它非常奇怪,因为我可以删除一个对象,却无法获取它?

这是我的获取请求代码:

using (var client = new AmazonS3Client(Amazon.RegionEndpoint.EUWest1))
{
    GetObjectRequest request = new GetObjectRequest
    {
       BucketName = bucketName,
       Key = keyName
    };
    GetObjectResponse response = client.GetObject(request);
    return response.ResponseStream;
}

哪个不起作用。 此DELETE请求正常

DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest
{
   BucketName = bucketName,
   Key = keyName
};
client.DeleteObject(deleteObjectRequest);

我认为这可能是我的存储桶政策的问题,但我不明白究竟是什么

{
  "Version": "2008-10-17",
  "Id": "Policy1437483839592",
  "Statement": [
    {
      "Sid": "Stmt1437483828676",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::ama.dyndns.tv/*",
      "Condition": {
        "StringLike": {
          "aws:Referer": [
            "MyIP",
            "MyTeammateIP"
          ]
        }
      }
    },
    {
      "Sid": "Givenotaccessifrefererisnomysites",
      "Effect": "Deny",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::ama.dyndns.tv/*",
      "Condition": {
        "StringNotLike": {
          "aws:Referer": [
            "MyIP",
            "MyTeammateIP"
          ]
        }
      }
    }
  ]
}

2 个答案:

答案 0 :(得分:2)

GET http请求负责人的值存在并且匹配其中一个提供的值时,您的第一个存储桶策略语句允许Referer:请求。 (请注意,这是一种非常原始的访问控制机制,因为标头很容易伪造)。

第二个策略拒绝了referer与提供的列表中的任何值都不匹配的请求。

referer只不过是浏览器或http用户代理库发送的请求标头。当您从代码发送GET请求时,除非您自己伪造,否则不会出现引用标头,作为请求的一部分。 任何匹配的Deny策略不仅会覆盖任何匹配的Allow策略...它还会覆盖您提供的任何身份验证凭据。因此,问题。

如果未将对象上的acl设置为允许公共访问的内容(例如x-amz-acl: public-read),则不需要Deny策略。在这种情况下,该对象将无法下载,因为除非Allow策略匹配您提供有效的身份验证凭据,否则拒绝是隐式的。默认情况下,除非您通过对象权限/ acl,存储桶策略或IAM用户策略允许,否则在S3中默认拒绝所有内容,即使您这样做,也会以匹配的显式Deny 始终为准。

答案 1 :(得分:1)

如果对象不存在且执行代码没有ListBucket权限,则即使调用代码具有getObject权限,也将返回403。

查看权限部分:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html