Подписанные в Cloudfront URL-адреса не работают с именами расположения содержимого S3 с пробелами, использующими.NET SDK
Я правильно настроил подписанные в Cloudfront URL-адреса с происхождением S3 и использую response-content-disposition
параметр строки запроса для указания имени загрузки файла. Подписанные URL-адреса, которые я генерирую с помощью.NET AWS SDK AmazonCloudFrontUrlSigner.GetCannedSignedURL
метод работает правильно, когда имя файла расположения содержимого не содержит пробелов. Однако, если имя файла содержит пробелы, я получаю доступ запрещен. Итак, что-то вроде приведенного ниже кода будет генерировать 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.
Я прочитал всю информацию в документах об обслуживании частного контента через CloudFront. Я прочитал код AmazonCloudFrontUrlSigner
класс Я также попробовал несколько комбинаций UrlEncode
как не кодирование, кодирование только части имени файла и даже не кодирование, а замена кодированной версией после создания подписанного URL. Все они либо отказывают в доступе, либо сообщают об ошибке, что подпись не соответствует URL.
1 ответ
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);