AWS SDK — Метод S3 GeneratePreSignedURL выдает «X-Amz-Expires должен быть неотрицательным»

#c# #amazon-s3

#c# #amazon-s3

Вопрос:

Я использую AWS SDK для доступа к корзине S3 для ЧТЕНИЯ и ЗАПИСИ объектов на C #. Я смог заставить его работать в проекте .NET в соответствии с инструкциями, приведенными в документации. Я хочу ограничить общедоступный доступ к корзине и предоставить истекающую общедоступную ссылку на объект.

Я обнаружил, что это можно сделать с помощью GeneratePreSignedURL метода. Он выдает строку URL-адреса в приведенном ниже формате.

 https://<BUCKET_NAME>.s3.<REGION>.amazonaws.com/<KEY>?X-Amz-Expires=-46077amp;X-Amz-Algorithm=AWS4-HMAC-SHA256amp;X-Amz-Credential=<GENERATED_CRED>amp;X-Amz-Date=20201122T071756Zamp;X-Amz-SignedHeaders=hostamp;X-Amz-Signature=<GENERATED_SIG>
 

Затем я помещаю этот URL-адрес в окно браузера, чтобы проверить, работает ли он должным образом. Проблема в том, что я получаю сообщение об ошибке X-Amz-Expires must be non-negative

Ответ почтальона :

 <Error>
    <Code>AuthorizationQueryParametersError</Code>
    <Message>X-Amz-Expires must be non-negative</Message>
    <RequestId>3ZCYDRAH2W3MET8P</RequestId>
    <HostId>f9BnxF5xXJIkklXfwMPVCxFSJLIkPxijzElqqA3bEcbt7PqY/lhzm6rbQ8KFzICy3B1J/Stdvf8=</HostId>
</Error>
 

В методе, который предоставляет SDK, я предоставляю положительное двойное значение для expiration значения, поэтому я не уверен, как сгенерированный URL-адрес имеет X-Amz-Expires=-46077 . Любая идея по этому поводу была бы очень полезна, спасибо.

Комментарии:

1. Я не могу найти никаких ссылок на GetFilePublicURL , это метод, который вы создали? Вы должны поделиться некоторым кодом своей попытки, а также тем, какой срок действия вы использовали. Это звучит так, как будто вы использовали истечение срока действия в прошлом.

2. @Shoejep ой!! извините GeneratePreSignedURL , я исправлю вопрос. Спасибо, что указали на это.. _s3Client.GeneratePreSignedURL(bucketName, key, DateTime.Now.Date, null); вот строка кода, которая генерирует URL-адрес.

3. @Shoejep Я попытался установить значение типа 15, используя DateTime.Now.AddMinute(15).Date для строки _s3Client.GeneratePreSignedURL(bucketName, key, DateTime.Now.Date, null); , это ничего не решило..

4. Использование DateTime.Now.AddMinute(15).Date звучит так, как будто это может быть вашей проблемой, .Date удаляет временную составляющую DateTime. Просто сделайте DateTime.Now.AddMinutes(15)

Ответ №1:

Вы должны использовать DateTime.Now.AddMinutes(15) вместо DateTime.Now.AddMinute(15).Date .

.Date удаляет временную составляющую DateTime

Как описано в документации для .Date

Новый объект с той же датой, что и у этого экземпляра, и значением времени, установленным на 12:00:00 полночь (00:00:00).