【问题标题】:Azure Storage: Is it possible to expire a SAS token before its expiry date?Azure 存储:SAS 令牌是否可以在其到期日期之前到期?
【发布时间】:2021-04-08 10:12:21
【问题描述】:

我根据需要在服务器上创建 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 受到速率限制。如果我希望用户在一小时内只上传一个文件,我需要一种方法来强制执行此操作。如果令牌在一小时内过期,理论上具有快速互联网连接的人可以上传数十个文件。

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

【问题讨论】:

  • 如果用户正在上传文件到指定的容器,那么在这种情况下,您可以使用存储访问策略来动态控制过期时间。

标签: azure azure-functions azure-storage azure-blob-storage


【解决方案1】:

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

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

撤销用户授权密钥

您可以通过调用撤销用户委托密钥操作来撤销用户委托密钥。当您撤销用户委托密钥时,任何依赖该密钥的共享访问签名都将失效。然后,您可以再次调用获取用户授权密钥操作并使用该密钥创建新的共享访问签名。这种方法是撤销用户委托 SAS 的最快方法。

【讨论】:

    【解决方案2】:

    除非 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)(检查以前的上传并实施限制逻辑) .

    【讨论】:

    • 很遗憾,6 年来,该请求没有任何进展。顺便说一句,我在帐户级别创建令牌。我更改了实现,以便每个 blob 创建它们。这至少应该将风险暴露限制在单个 blob 中。
    猜你喜欢
    • 1970-01-01
    • 2018-07-24
    • 2020-02-27
    • 2016-04-27
    • 1970-01-01
    • 2013-02-14
    • 2021-05-10
    • 1970-01-01
    • 2018-04-12
    相关资源
    最近更新 更多