Cloudfront 签名 URL 不适用于使用 .NET SDK 的带空格的 S3 内容处置文件名

Jef*_*ger 1 .net c# amazon-s3 amazon-web-services amazon-cloudfront

我已经正确设置了带有 S3 源的 Cloudfront 签名 URL,并且正在使用response-content-disposition查询字符串参数来指定文件下载名称。当内容处置文件名不包含空格时,我使用 .NET AWS SDKAmazonCloudFrontUrlSigner.GetCannedSignedURL方法生成的签名 URL可以正常工作。但是,如果文件名包含空格,则访问被拒绝。因此,类似于下面的代码将生成一个拒绝访问的 URL。

var contentDisposition = HttpUtility.UrlEncode("attachment;filename=My File.txt");
var key = "example.txt?response-content-disposition="+contentDisposition;
return AmazonCloudFrontUrlSigner.GetCannedSignedURL(
    AmazonCloudFrontUrlSigner.Protocol.https,
    "myBucket",
    cloudFrontPrivateKey,
    key, cloudFrontAccessKeyId, expirationDateTime);
Run Code Online (Sandbox Code Playgroud)

它显然似乎与 URL 编码有关。

我已经通读了有关通过 CloudFront 提供私有内容的文档中的所有信息。我读AmazonCloudFrontUrlSigner代码。我还尝试了多种组合,UrlEncode例如不编码,仅编码文件名部分,甚至不编码但在生成签名 URL 后用编码版本替换。所有这些要么拒绝访问,要么给出签名与 url 不匹配的错误。

Jef*_*ger 5

HttpUtility.UrlEncode方法将空格编码为+根据标准可接受的空格。但是,由于某种原因我不明白,这会导致签名 URL 和内容处置出现问题。空间的另一种编码%20正常工作。所以编码后,更换+%20。工作版本是:

var contentDisposition = HttpUtility.UrlEncode("attachment;filename=My File.txt");
contentDisposition = contentDisposition.Replace("+", "%20");
var key = "example.txt?response-content-disposition="+contentDisposition;
return AmazonCloudFrontUrlSigner.GetCannedSignedURL(
    AmazonCloudFrontUrlSigner.Protocol.https,
    "myBucket",
    cloudFrontPrivateKey,
    key, cloudFrontAccessKeyId, expirationDateTime);
Run Code Online (Sandbox Code Playgroud)