Azure 存储:是否可以在 SAS 令牌到期之前使其过期?

Azure Storage: Is it possible to expire a SAS token before its expiry date?

我根据需要在服务器上创建 SAS 令牌并将它们发送给用户,以便他们可以上传 blob。默认情况下,每个令牌都设置为在 小时 后过期。我还使用 Azure Functions 进行服务器端处理。

var cloudStorageAccount = // create a new CloudStorageAccount
var sharedAccessAccountPolicy = new SharedAccessAccountPolicy
{
    Permissions = SharedAccessAccountPermissions.Read | SharedAccessAccountPermissions.Write,
    Services = SharedAccessAccountServices.Blob,
    ResourceTypes = SharedAccessAccountResourceTypes.Object,
    SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
    Protocols = SharedAccessProtocol.HttpsOnly
};

var token = cloudStorageAccount.GetSharedAccessSignature(sharedAccessAccountPolicy);

我想做的是在通过 EventGridTrigger 侦听 blob 更改后成功使用一次 SAS 令牌后使其过期。例如,如果用户 10 分钟 上传文件,则该令牌将不再可用。这是为了防止滥用,因为生成 SAS 令牌的 API 是有速率限制的。如果我希望用户在一小时内只上传一个文件,我需要一种方法来强制执行此操作。如果令牌在一小时后过期,理论上互联网连接速度快的人可以上传数十个文件。

所以,我的问题是,是否可以通过编程方式使令牌过期,即使它的到期日期尚未到?在我的场景中可行的另一种替代方法是在可能的情况下生成一次性令牌。

我相信您可以为此使用用户委派 SAS。可以通过编程方式创建和撤销用户委派 SAS。

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

Revoke the user delegation key

You can revoke the user delegation key by calling the Revoke User Delegation Keys operation. When you revoke the user delegation key, any shared access signatures relying on that key become invalid. You can then call the Get User Delegation Key operation again and use the key to create new shared access signatures. This approach is the quickest way to revoke a user delegation SAS.

除非 SAS 令牌与安全策略关联并且您撤销了该策略或更改了与存储帐户关联的访问密钥,否则您无法在其数据过期之前撤销 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

您最好的选择是让您的用例的到期时间尽可能短。如果您绝对必须限制特定用户的上传,那么您可以考虑让用户通过一个单独的受控应用程序而不是直接进入可用作网守的存储(如 Web API)(检查以前的上传和实施限制逻辑)。