首页 > 解决方案 > 生成 sas 令牌时请求正文太大,超出最大允许限制

问题描述

我正在使用以下脚本使用 bash 生成 sas 令牌

sas_token=$(curl https://management.azure.com/subscriptions/$subscription_id/resourceGroups/$rg_name/providers/Microsoft.Storage/storageAccounts/$storage_account/listServiceSas/?api-version=2017-06-01 -X POST -d "{\"canonicalizedResource\":\"/blob/$storage_account/$sa_container\",\"signedResource\":\"c\",\"signedPermission\":\"rcw\",\"signedProtocol\":\"https\",\"signedExpiry\":\"$(date -d '+30 minutes' +%FT%TZ)\"}" -H "Authorization: Bearer $token" | jq -r '.serviceSasToken')

当我尝试上传一个 500mb 的大文件时,它给了我以下错误请求正文太大并且超过了最大允许限制。67108864

从上述脚本生成的 sas 令牌是:

sv=2015-04-05&sr=c&spr=https&se=2021-04-09T06%3A22%3A19.0000000Z&sp=racwdl&sig=xxxx

当我从 azure 门户生成 sas 令牌时,我得到它如下

sp=racwdl&st=2021-04-09T05:54:16Z&se=2021-04-09T13:54:16Z&spr=https&sv=2020-02-10&sr=c&sig=xxxx

在这里,如果您注意到签名版本的 sv 是 2020-02-10 并且使用此 sas 令牌,我可以上传大文件。

所以我注意到在上面的 sas 令牌中,sv 是不同的,所以我尝试在我的代码中添加签名版本,如下所示

sas_token=$(curl https://management.azure.com/subscriptions/$subscription_id/resourceGroups/$rg_name/providers/Microsoft.Storage/storageAccounts/$storage_account/listServiceSas/?api-version=2017-06-01 -X POST -d "{\"canonicalizedResource\":\"/blob/$storage_account/$sa_container\",\"signedResource\":\"c\",\"signedPermission\":\"rcw\",\"signedProtocol\":\"https\",\"SignedVersion\":\"2020-02-10\",\"signedExpiry\":\"$(date -d '+30 minutes' +%FT%TZ)\"}" -H "Authorization: Bearer $token" | jq -r '.serviceSasToken')

但它仍然会生成一个带有 2015-04-05 而不是我指定的 sv。

你能告诉我如何解决这个问题吗

标签: azureazure-storage

解决方案


就更改签名版本参数而言,我认为您无能为力。

我的猜测是,通过存储资源提供程序 API 生成 SAS 的实现使用了存储 REST API 版本2015-04-05(签名版本参数),如果您查看request body parameters,您会注意到请求中没有指定签名版本参数的参数。

您可以做的一件事是更改上传实现并以块的形式上传大 blob,其中每个块的大小小于或等于 64 MB。

FWIW,存储服务版本 2016-05-31 中的块大小限制从 64 MB 更改为 100 MB:https ://docs.microsoft.com/en-us/rest/api/storageservices/version-2016-05- 31 .


推荐阅读