首页 文章

使用c#对Cloudfront签名的URL

提问于
浏览
4

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

  • 限制存储桶访问:是

  • Origin Access Identity:使用现有标识

  • 授予读取权限:是,更新存储桶策略

然后所有文件都在Cloudfront上公开可用,无论我在S3中对ACL有什么设置(所以即使file.txt对S3中的任何人都没有权限,也可以通过Cloudfront访问),我无法判断是否签名URL是否有效,因为下载可以使用或不使用查询字符串,并且文件已公开 . 基本上,我如何将我的文件设为私有但可以使用签名URL下载(并且我的签名方法是否正确?) . 如果删除生成的存储桶策略,则会再次限制访问 . 我想我需要知道如何设置存储桶策略,以便原始访问标识只能访问带有签名URL的存储桶...也许 .

非常感谢您的帮助!

1 回答

  • 5

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

    • 为AWS中的安全项设置新存储桶

    • 在Cloudfront中添加新分发,指向在1中创建的新存储桶,为'Restrict Viewer Access'选择是,为'Forward Query Strings'选择'Yes'(这仅用于添加向特定下载添加内容处置的功能),并为'Trusted Signers'选择'Self'

    • 在AWS顶部,单击您的姓名并选择'Security Credentials'并选择'Continue',因为我们选择了上面的'Self' .

    • 单击'CloudFront Key Pairs'并选择'Create New Key Pair' . 提供时下载密钥文件(他们赢了't be offered again), you need the private key. Also copy the Access Key ID as you' ll需要它 .

    • 转到您的发行版,单击安全发行版旁边的i,单击起源选项卡,单击'create origin'或选择原点并选择编辑,然后选择'Yes'以限制存储桶访问,创建新标识和是更新存储桶策略 . 这实际上意味着Cloudfront可以针对您的存储桶进行身份验证 .

    • 在您的项目中,转到NuGet并搜索'AWS'并安装AWS开发工具包 .

    • 将私钥文件(pk * ****** .pem)复制到网站根目录上方的文件夹(或相对私密的某个位置)

    • 根据以下内容添加一些代码,以生成带有内容处置标头的安全URL .

    我不得不说https://forums.aws.amazon.com/thread.jspa?messageID=421768的帖子在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));
    

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

相关问题