Обновление [обходной путь]
Тем временем я разрешил противоречивые результаты моих тестов, которые проистекают из несистематического тестирования и манипуляций с URL.Следующий обходной путь помогает мне (т. Е. Проверен и воспроизводим), просто исходя из вашего решения:
string bucketName = "foo.example.com";
// [...]
GetPreSignedUrlRequest request = new GetPreSignedUrlRequest()
.WithBucketName(bucketName)
.WithKey(key)
.WithExpires(DateTime.Now.AddMinutes(32))
.WithProtocol(Protocol.HTTP);
Теперь это дает ошибочный URL с дублированным доменным именем, то есть http://foo.example.com.foo.example.com/myfile.txt?[...]
Дубликат может быть просто удален, например:
string url = s3Client.GetPreSignedURL(request);
// KLUDGE: remove duplicate domain name.
url = url.Replace(bucketName + "." + bucketName, bucketName);
Это дает мне правильный рабочий предварительно подписанный URL (т.е. http://foo.example.com/myfile.txt?[...]
), обходя обнаруженное ограничениеотносительно желаемого подхода, описанного ниже.
Обоснование
Управление сгенерированным URL-адресом выглядит так странно, но это не влияет на аутентификацию строки запроса в соответствии с тем, как создаются эти подписи,см. Альтернатива аутентификации запроса строки запроса , где вы найдете псевдограмму , которая иллюстрирует метод аутентификации запроса строки запроса :
StringToSign = HTTP-VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Expires + "\n" +
CanonicalizedAmzHeaders +
CanonicalizedResource;
То естьдоменное имя вообще не используется для создания подписи, а только информация о самом ресурсе;section Пример Query String Request Authentication прямо под ссылочным фрагментом псевдограммы иллюстрирует это фактическим ресурсом.
Assessment
Я не знаю, существует ли ещенедоразумение с нашей стороны, или это может быть просто ошибка в AWS SDK для .NET , см., например, Почему мой предварительно подписанный запрос S3 недействителен, когда я устанавливаю переопределение заголовка ответа, содержащее«+»? для связанной ошибки, исправленной также с помощью аналогичного обходного пути, который, тем не менее, был исправлен;соответственно, его, вероятно, следует передать на форумы AWS и / или каналы поддержки, чтобы получить соответствующий ответ или решение.
Удачи!
Желаемый ответ [дисфункциональный]
Обработка S3 CNAME подразумевает имя корзины уже, поэтому все, что вам нужно сделать, это удалить имя корзины из GetPreSignedUrlRequest
, то есть оно должно выглядеть так:
GetPreSignedUrlRequest request = new GetPreSignedUrlRequest()
.WithKey(key)
.WithExpires(DateTime.Now.AddMinutes(5))
.WithProtocol(Protocol.HTTP);
I 'Я проверил это с моим ведром, и оно работает, как и ожидалось, вот так.