Я создаю токены SAS на сервере по требованию и отправляю их пользователям, чтобы они могли загружать блобы. По умолчанию каждый токен настроен на истечение срока действия через часа. Я также использую Azure Functions для обработки на стороне сервера.

var cloudStorageAccount = // создаем новый аккаунт CloudStorageAccount
var sharedAccessAccountPolicy = new SharedAccessAccountPolicy
{
    Разрешения = SharedAccessAccountPermissions.Read | SharedAccessAccountPermissions.Write,
    Services = SharedAccessAccountServices.Blob,
    ResourceTypes = SharedAccessAccountResourceTypes.Object,
    SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
    Protocols = SharedAccessProtocol.HttpsOnly
};

var token = cloudStorageAccount.GetSharedAccessSignature(sharedAccessAccountPolicy);

Я хотел бы сделать так, чтобы срок действия токена SAS истекал после того, как он был успешно использован один раз, прослушивая изменения блоба через EventGridTrigger. Например, если пользователю потребовалось 10 минут, чтобы загрузить файл, этот токен больше не должен использоваться. Это делается для предотвращения злоупотреблений, поскольку API, генерирующий токены SAS, ограничен по скорости. Если я хочу, чтобы пользователь загружал только один файл в течение часа, мне нужен способ обеспечить это. Кто-то с быстрым интернет-соединением теоретически может загрузить десятки файлов, если срок действия токена истечет через час.

Так что мой вопрос заключается в том, можно ли программным путем прекратить действие токена, даже если срок его действия еще не истек? Другая альтернатива, которая сработала бы в моем сценарии, - это генерировать одноразовые токены, если это возможно.

Ответы (2)

Вы не можете отозвать токен SAS до истечения срока его действия, если только он не связан с политикой безопасности и вы не отмените эту политику или не измените ключ доступа, связанный с учетной записью хранилища. Я не думаю, что ни одна из этих идей действительно применима к вашему случаю. Токены SAS по сути являются самодостаточными и не могут быть изменены после выпуска, поэтому вы не можете досрочно их аннулировать.

Официальное объяснение см. в разделе "Отзыв" на этой странице: https://docs.microsoft.com/en-us/azure/storage/blobs/security-recommendations#revocation

.

"Служба SAS, не связанная с хранимой политикой доступа, не может быть отозвана."

Также не существует токенов SAS однократного использования, и, согласно этому запросу обратной связи, Microsoft не планирует реализовывать эту функцию: https://feedback.azure.com/forums/217298-storage/suggestions/6070592-one-time-use-sas-tokens

.

Ваш лучший вариант - просто держать время истечения срока действия настолько коротким, насколько это возможно для вашего случая использования. Если вам обязательно нужно ограничить количество загрузок для конкретного пользователя, то подумайте о том, чтобы пользователь проходил через отдельное управляемое приложение, а не напрямую в хранилище (например, через веб-интерфейс API), которое можно использовать в качестве привратника (проверяя предыдущие загрузки и реализуя логику ограничения).

Я считаю, что для этого можно использовать SAS делегирования пользователя. SAS делегирования пользователя можно создавать и отзывать программно.

https://docs.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas

Отмена ключа делегирования пользователя

Вы можете отозвать ключ делегирования пользователя, вызвав операцию Revoke User Delegation Keys. Когда вы отзываете ключ делегирования пользователя, все подписи общего доступа, основанные на этом ключе, становятся недействительными. Затем вы можете снова вызвать операцию Get User Delegation Key и использовать ключ для создания новых подписей общего доступа. Этот подход является самым быстрым способом отзыва ключа делегирования пользователя SAS.

2022 WebDevInsider