c# - 使用 c# 的 Cloudfront 签名 URL

标签 c# url amazon-cloudfront signed

我尝试了很多事情,但我承认失败了(我在这里阅读了很多回复,但到目前为止没有一个对我有帮助)。我正在尝试为 Cloudfont 上保存的文件设置签名 URL。我能够为 S3 创建签名的 URL,但我无法为 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 是否有效,因为下载可以使用或不使用查询字符串,并且文件已公开可用。本质上,我怎样才能使我的文件私有(private)但可以使用签名 URL 下载(我的签名方法是否正确?)。如果我删除生成的存储桶策略,访问将再次受到限制。我想我需要知道如何设置存储桶策略,以便原始访问身份只能访问具有签名 URL 的存储桶......也许吧。

非常感谢您的帮助!

最佳答案

经过一段时间的休息并重新思考,这里是我出错的地方。在同一个发行版中不可能有一些内容受到保护而另一些内容没有受到保护。整个发行版是否安全。这是我的解决方案。

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

我希望对某人有所帮助,无论如何我都会将其用作个人资源!在没有设置“限制查看者访问”的现有存储桶上启用源访问身份,它实际上会打开存储桶中所有项目的权限。这可能是也可能不是可取的!如果我有任何问题,请告诉我,这对我来说都是全新的。

关于c# - 使用 c# 的 Cloudfront 签名 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17447674/

相关文章:

c# - LINQ where 子句中的多个条件

c# - 有效消除 .NET 表达式树中的公共(public)子表达式

codeigniter - 如何在CodeIgniter中切换语言

javascript - 在 Javascript 中从 BLOB URL 读取数据

ruby - `URI` 和 `URI.parse` 之间的区别

amazon-web-services - CloudFront 分发和 AWS 颁发的证书给出 SSL_ERROR_NO_CYPHER_OVERLAP

php - PHP 中的 AWS Cloudfront SetCookie

c# - 总是在 Override 中调用 base.Method 而不为简单脚本提及它

c# - 下拉更改不调用方法 asp.net mvc jquery

caching - 基于子域的 AWS CloudFront 缓存