我已正确设置具有S3源的Cloudfront签名URL,并使用response-content-disposition
查询字符串参数指定文件下载名称。当内容处理文件名不包含空格时,我使用.NET AWS SDK AmazonCloudFrontUrlSigner.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);
它似乎与URL编码有关。
我已阅读有关Serving Private Content through CloudFront的文档中的所有信息。我读了code of the AmazonCloudFrontUrlSigner
class。我还尝试了许多UrlEncode
的组合,比如不编码,只编码文件名部分甚至不编码,但在生成签名URL后用编码版本替换。所有这些都提供拒绝访问或签名与网址不匹配的错误。
答案 0 :(得分:4)
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);