我刚刚开始在我的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"
]
}
}
}
]
}
答案 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