我尝试了很多东西而且我承认失败(我在这里已经阅读了很多回复但到目前为止没有人帮助过我)。我正在尝试为Cloudfont上保存的文件设置签名URL。我能够为S3创建签名的URL,但我无法为Cloudfront工作。对于cloudfront,我使用的是AWS SDK中的以下内容:
var url = AmazonCloudFrontUrlSigner.GetCannedSignedURL( AmazonCloudFrontUrlSigner.Protocol.http, "cdn.coffeebreakgrooves.com", privateKey,
file, cloudFrontKeyPairID, DateTime.Now.AddDays(2));
我收到了一个已签名的URL,但是在关注链接时我被拒绝访问,当我读到它时,建议我设置Origin Access Identity。然后我转到我的分发设置并设置Origin Access Identity并选择:
然后所有文件都在Cloudfront上公开可用,无论我在S3中对ACL有什么设置(所以即使file.txt对S3中的任何人都没有权限,它也可以通过Cloudfront访问)我无法分辨如果签名的URL工作与否,因为下载可以使用或不使用查询字符串,并且文件已公开。从本质上讲,我如何将我的文件设为私有但可以使用签名URL下载(并且我的签名方法是否正确?)。如果删除生成的存储桶策略,则会再次限制访问。我想我需要知道如何设置存储桶策略,以便原始访问标识只能访问带有签名URL的存储桶...也许。
非常感谢您的任何帮助!
答案 0 :(得分:6)
经过一段时间的休息,重新思考这里是我出错的地方。在同一分发中不可能保护某些内容而不保护其他内容。整个分发是否安全。这是我的解决方案。
我不得不说,如果没有托斯滕在https://forums.aws.amazon.com/thread.jspa?messageID=421768的帖子的帮助,我就无法解决这个问题,这篇文章是用PHP编写的,但我指出了正确的方向:
string cloudFrontKeyPairID = "myaccesskeyidfrompoint4";
string pathtokey = HttpContext.Current.Request.MapPath("~/").Replace("wwwroot", "ssl") + "pk-mykeyidfilenamesavedin4.pem";
FileInfo privateKey = new FileInfo(pathtokey);
string file = "folder/mytrack.mp3?response-content-disposition=" +
HttpContext.Current.Server.UrlEncode("attachment;filename='a_filename_with_no_spaces.mp3'");
//I can't figure out how to do spaces or odd characters.
url = AmazonCloudFrontUrlSigner.GetCannedSignedURL(
AmazonCloudFrontUrlSigner.Protocol.http,
"customcname.mydomain.com",
privateKey,
file,
cloudFrontKeyPairID,
DateTime.Now.AddDays(2));
我希望能帮助某人,无论如何我将把它当作个人资源使用!在没有“限制查看器访问权限”的现有存储桶上启用原始访问标识设置它基本上打开了存储桶上所有项目的权限。这可能是也可能不是!如果我有任何不妥之处请告诉我,这对我来说都很新鲜。