Подписанные URL-адреса Cloudfront с помощью c#


Я перепробовал много вещей, и я признаю поражение (я прочитал много ответов здесь, но ни один не помог мне до сих пор). Я пытаюсь настроить подписанные URL-адреса для файлов, хранящихся на Cloudfont. Я могу создавать подписанные URL-адреса для S3, но я не могу заставить что-либо работать для Cloudfront. Для cloudfront я использую следующее из AWS SDK:

var url = AmazonCloudFrontUrlSigner.GetCannedSignedURL(    AmazonCloudFrontUrlSigner.Protocol.http, "cdn.coffeebreakgrooves.com", privateKey, 
file, cloudFrontKeyPairID, DateTime.Now.AddDays(2));

Я получаю подписанный URL-адрес, но мне отказывают в доступе, когда я иду по ссылке, которая, когда я прочитал об этом, предложила мне настроить Origin Access Идентичность. Поэтому я перешел в настройки дистрибутива и настройки Origin Access Identity и выбрал:

  • Ограничить Доступ К Ведру: Да
  • идентификатор доступа к источнику: используйте существующий идентификатор
  • Предоставить Разрешения На Чтение: Да, Обновить Политику Корзины

Тогда все файлы становятся общедоступными на Cloudfront, независимо от каких-либо настроек у меня для ACL в S3 (так что даже если файл.txt не имеет никаких разрешений для кого-либо в S3, к нему можно получить доступ через Cloudfront), и я не могу сказать если подписанные URL-адреса работают или нет, потому что загрузка работает с или без строки запроса и файлы стали общедоступными. По существу, как я могу сделать мои файлы частными, но загружаемыми с подписанным URL (и является ли мой метод подписи правильным?). Если я удалю созданную политику корзины, доступ снова будет ограничен. Я думаю, что мне нужно знать, как настроить политику корзины так, чтобы идентификатор доступа origin мог получить доступ только к корзине с подписанным URL... может быть.

Заранее большое спасибо за любую помощь!

1 4

1 ответ:

После небольшого перерыва и переосмысления вот где я ошибался. Невозможно, чтобы какой-то контент был защищен, а другой не был защищен в одном и том же дистрибутиве. Либо весь дистрибутив обеспечен, либо нет. Вот мое решение.

  1. Настройка новой корзины для защищенных элементов в AWS
  2. Добавьте новый дистрибутив в Cloudfront, указав на новую корзину, созданную в 1, и выберите Да для "ограничить доступ к Просмотрщику" и "да" для "строк прямого запроса" (это только для добавления возможность добавлять диспозицию контента для конкретных загрузок) и выбрать "Self" для "надежных подписчиков"
  3. в верхней части AWS нажмите на свое имя и выберите "Учетные данные безопасности" и выберите "продолжить", как мы выбрали "Self" выше.
  4. Нажмите на "CloudFront Key Pairs" и выберите "Создать новую пару ключей". Загрузите файлы ключей, когда они будут предложены (они не будут предложены снова), вам нужен закрытый ключ. Также скопируйте идентификатор ключа доступа, так как он вам понадобится.
  5. перейдите к своим дистрибутивам, нажмите на кнопку я рядом с защищенным дистрибутивом, нажмите на вкладку origins, нажмите "Создать origin" или выберите origin и выберите Edit, затем выберите " Да " для ограничения доступа к ведру, создайте новую идентичность и да обновите политику ведра. Это, по сути, означает, что Cloudfront может аутентифицироваться в вашем ведре.
  6. в вашем проекте перейдите в NuGet, найдите " AWS " и установите AWS SDK.
  7. скопируйте файл закрытого ключа (pk***.pem) в папку над корнем вашего сайта (или где-то еще относительно частный)
  8. Добавьте некоторый код согласно следующему, чтобы создать безопасный URL-адрес с заголовком Content Disposition.
Я должен сказать, что не смог бы решить эту проблему без помощи сообщения Торстена на 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));

Я надеюсь, что это кому-то поможет, я буду использовать это как личный ресурс в любом случае! Включение идентификации доступа к источнику на существующее ведро, которое не имеет настройки "ограничить доступ к Просмотрщику", по сути, открывает права доступа для всех элементов в вашем ведре. Это может быть или не быть желательно! Если у меня что-то не так, пожалуйста, дайте мне знать, это все довольно ново для меня.