使用c#对Cloudfront签名的URL

时间:2013-07-03 12:13:56

标签: c# url amazon-cloudfront signed

我尝试了很多东西而且我承认失败(我在这里已经阅读了很多回复但到目前为止没有人帮助过我)。我正在尝试为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的存储桶...也许。

非常感谢您的任何帮助!

1 个答案:

答案 0 :(得分:6)

经过一段时间的休息,重新思考这里是我出错的地方。在同一分发中不可能保护某些内容而不保护其他内容。整个分发是否安全。这是我的解决方案。

  1. 在AWS中为您的安全项目设置新存储桶
  2. 在Cloudfront中添加一个新分发,指向在1中创建的新存储桶,为“限制查看者访问”选择“是”,为“正向查询字符串”选择“是”(这仅用于添加向特定用户添加内容处置的功能下载并为“可信赖的签名者”选择“自我”
  3. 在AWS顶部点击您的姓名并选择“安全凭据”,然后选择“继续”,因为我们选择了上面的“自我”。
  4. 点击“CloudFront密钥对”,然后选择“创建新密钥对”。提供时下载密钥文件(它们不会再次提供),您需要私钥。同时复制您需要的访问密钥ID。
  5. 转到您的发行版,单击安全发行版旁边的i,单击“起源”选项卡,单击“创建起点”或选择原点并选择“编辑”,然后选择“是”以限制存储桶访问,创建新标识和是更新存储桶策略。这实际上意味着Cloudfront可以针对您的存储桶进行身份验证。
  6. 在您的项目中,转到NuGet并搜索“AWS”并安装AWS SDK。
  7. 将私钥文件(pk * ** .pem)复制到网站根目录上方的文件夹(或相对私密的地方)
  8. 按照以下方式添加一些代码,以生成带有内容处置标头的安全URL。
  9. 我不得不说,如果没有托斯滕在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));
    

    我希望能帮助某人,无论如何我将把它当作个人资源使用!在没有“限制查看器访问权限”的现有存储桶上启用原始访问标识设置它基本上打开了存储桶上所有项目的权限。这可能是也可能不是!如果我有任何不妥之处请告诉我,这对我来说都很新鲜。