当前位置: 首页 > 知识库问答 >
问题:

使用C#的Cloudfront签名URL

奚英朗
2023-03-14

我已经尝试了很多事情,我承认失败了(我在这里读了很多回应,但到目前为止没有一个对我有帮助)。我正在尝试为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生成,但我得到访问拒绝时,跟随链接,当我读到它建议我设置起源访问标识。因此,我转到我的分发设置和设置来源访问标识,并选择:

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

然后,所有文件在Cloudfront上都可以公开使用,而不管我在S3中对ACL有什么设置(因此,即使File.txt对S3中的任何人都没有权限,它也可以通过Cloudfront访问),我也无法判断签名的URL是否有效,因为下载可以使用或不使用querystring,文件也可以公开使用。从本质上讲,我如何使我的文件私有,但可以通过签名的URL下载(以及我的签名方法是否正确?)。如果删除生成的桶策略,访问将再次受到限制。我想我需要知道如何设置bucket策略,以便原始访问标识只能访问带有签名URL的bucket...也许吧。

非常感谢您的帮助!

共有1个答案

钱志义
2023-03-14

经过一段时间的Rest和重新思考,这里是我出错的地方。在同一发行版中,不可能有一些内容被保护而其他内容不被保护。整个发行版是否安全。以下是我的解决方案。

  1. 在AWS中为您的安全项设置新的bucket
  2. 在Cloudfront中添加指向1中创建的新bucket的新发行版,并为“限制查看器访问”选择是,为“转发查询字符串”选择“是”(这只是为了添加向特定下载添加内容处理的功能),为“受信任的签名者”选择“self”
  3. 在AWS的顶部单击您的名称,然后选择“安全凭据”,然后选择“继续”,就像我们在上面选择“自我”一样。
  4. 单击“CloudFront密钥对”并选择“创建新密钥对”。下载密钥文件时,提供(他们将不会再次提供),您需要私钥。还可以根据需要复制访问密钥ID。
  5. 转到您的发行版,单击安全发行版旁边的i,单击来源选项卡,单击“创建来源”或选择来源并选择编辑,然后选择“是”限制桶访问,创建新标识,是更新桶策略。这实际上意味着Cloudfront可以根据您的bucket进行身份验证。
  6. 在您的项目中,转到NuGet并搜索'AWS',然后安装AWS SDK。
  7. 将私钥文件(pk***.pem)复制到网站根目录上方的文件夹(或某个相对私人的地方)
  8. 按照以下步骤添加一些代码,以生成一个具有内容处理头的安全URL。

我不得不说,如果没有Torsten在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));

我希望这能帮助别人,我会把这作为个人资源无论如何!在没有设置“限制查看器访问”的现有bucket上启用原始访问标识,它实质上打开了bucket上所有项目的权限。这可能是可取的,也可能是不可取的!如果我有什么问题请告诉我,这对我来说都是很新的。

 类似资料:
  • 如何使用AWS SDK创建云端签名URL? 这看起来真的很容易做到,但我就是看不到。我基本上了解它的工作原理,可能可以自己编写简单的Java代码。AWS SDK没有为此提供方法似乎很奇怪。 前面的问题,但使用C#:cloudfront private time limited url 该链接从理论上解释了此类cloudfront URL是如何生成的,但没有代码示例 这个链接解释了如何使用Java实

  • 我有所有的参数,像Key-id,cloudfront domain和pem文件。但我不知道如何实现它。谁能帮我拿些样品。 我找了很多,但没有找到。我得到了使用node.js创建签名url的示例代码,但我不想使用node.js。

  • 我正试图使用一个以S3 bucket为起点的Cloudfront私有发行版来提供内容。 我的存储桶中有一个图像文件,用于测试目的,其权限设置为私有。我已经设置了我的存储桶策略,因此Cloudfront Origin Access Idbody具有获得权限 当我将Cloudfront发行版设置为public(不使用签名URL)时,它可以正常工作。该对象不能通过直接S3链接访问,但可以使用Cloudf

  • 问题内容: 简短版:如何使用Python使用Amazon CloudFront / S3使签名的URL“按需”以模仿Nginx的X-Accel- Redirect行为(即保护下载)。 我已经安装了Django服务器,并在Nginx前端上运行。我一直对它的请求感到困惑,最近不得不将其安装为Tornado WSGI应用程序,以防止它在FastCGI模式下崩溃。 现在由于服务器对媒体的请求过多,我的服务

  • 除了签名url,Amazon最近还引入了Cloudfront签名cookie。 关于签名url也有类似的问题。显然,CloudFrontSDK中支持签名url 然而,我在aws python SDK中找不到对该功能的支持。

  • 我在执行cloudfront签名的cookies时遇到以下错误 CORS 策略已阻止从源“https://b.xyz.com”在“https://a.xyz.com/test.html”处访问 XMLHttpRequest:请求的资源上不存在“访问控制-允许-源”标头。 我正在访问a.xyz上的文件。com(域1)从b.xyz。com(域2)。在限制云前端(域1)分发的查看器访问(使用签名cook