使用c#对Cloudfront签名的URL

Ric*_*son 5 c# url signed amazon-cloudfront

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

我收到了一个签名的URL,但是在关注链接时我被拒绝访问,当我读到它时,我建议设置Origin Access Identity.然后我转到我的分发设置并设置Origin Access Identity并选择:

  • 限制存储桶访问:是
  • 源访问标识:使用现有标识
  • 授予读取权限:是,更新存储桶策略

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

非常感谢您的帮助!

Ric*_*son 7

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

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

我不得不说,如果没有托斯滕的帖子,我无法解决这个问题,请访问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));
Run Code Online (Sandbox Code Playgroud)

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