我试图从Azure上的容器列出和下载blob。当我尝试使用存储帐户访问密钥时,它完全正常。但是,使用SAS令牌时失败。我使用以下PowerShell脚本生成了SAS令牌:
$storageContext = New-AzureStorageContext -StorageAccountName "myAccount" -StorageAccountKey "<account key>"
$permission = "rwdl"
$sasToken = New-AzureStorageContainerSASToken -Name "myContainer" -Policy "testPolicy" -Context $storageContext >>sastoken.txt
"
我得到以下结果:
?sv=2017-04-17&sr=c&si=testPolicy&sig=dbS680%2FXgPp4o%2BQCCzpYzGZszCnDHVjCkdHZRf6KDeg%3D
我附加了带有资源URI的sas标记来获取:
https://myAccount.blob.core.windows.net/myContainer?sv=2017-04-17&sr=c&si=testPolicy&sig=dbS680%2FXgPp4o%2BQCCzpYzGZszCnDHVjCkdHZRf6KDeg%3D
并运行以下CLI命令:
az storage blob list --container-name myContainer --account-name myAccount --auth-mode key --debug --sas-token "https://myAccount.blob.core.windows.net/myContainer?sv=2017-04-17&sr=c&si=testPolicy&sig=dbS680%2FXgPp4o%2BQCCzpYzGZszCnDHVjCkdHZRf6KDeg%3D" >> bloblist.txt
我收到以下错误:
azure.multiapi.storage.v2018_03_28.common.storageclient:Client-Request-ID = 0f7a 7762-3729-11e9-8b32-ffc4c9592d0a重试策略不允许重试:Server- Timestamp = Sat,23 Feb 2019 05:08: 30 GMT,Server-Request-ID = 21f07a6a-f01e-00e9-32 35-cb7d5c000000,HTTP状态代码= 403,异常=服务器无法验证请求。确保正确形成Authorization标头的值,包括签名。 ErrorCode:AuthenticationFailed
AuthenticationFailed
Server无法验证请求。确保严格形成Authorization标头的值,包括签名.RequestId:21f07a6a-f01e-00e9-3235-cb7d5c000000时间:2019-02-23T05:08:30.7149353Z签名大小无效。
您没有执行此操作所需的权限。根据您的操作,您可能需要分配以下其中一个:
"Storage Blob Data Contributor (Preview)"
"Storage Blob Data Reader (Preview)"
"Storage Queue Data Contributor (Preview)"
"Storage Queue Data Reader (Preview)"
如果要使用旧的身份验证方法并允许查询正确的帐户密钥,请使用“--auth-mode”参数和“key”值。
事件:CommandInvoker.OnFilterResult []'CommandResultItem'对象不可迭代Traceback(最近一次调用最后一次):文件“C:\ Users \ VSSADM~1 \ AppData \ Local \ Temp \ pip-install-r8nye8gm \ knack \ knack \ cl i.py“,第212行,在调用文件”C:\ Users \ VSSADM~1 \ AppData \ Local \ Temp \ pip-install-r8nye8gm \ knack \ knack \ ou tput.py“,第132行,在文件中” C:\ Users \ VSSADM~1 \ AppData \ Local \ Temp \ pip-install-r8nye8gm \ knack \ knack \ ou tput.py“,第38行,格式_json TypeError:'CommandResultItem'对象不可迭代遥测.save:保存缓存中长度为2499的遥测记录
我已经尝试生成存储帐户级SAS门户,但没有找到任何运气。
请帮忙!
您收到此错误的原因是您使用完整的SAS URL而不是SAS令牌。
请更改以下内容:
az storage blob list --container-name myContainer --account-name myAccount --auth-mode key --debug --sas-token "https://myAccount.blob.core.windows.net/myContainer?sv=2017-04-17&sr=c&si=testPolicy&sig=dbS680%2FXgPp4o%2BQCCzpYzGZszCnDHVjCkdHZRf6KDeg%3D" >> bloblist.txt
至
az storage blob list --container-name myContainer --account-name myAccount --auth-mode key --debug --sas-token "?sv=2017-04-17&sr=c&si=testPolicy&sig=dbS680%2FXgPp4o%2BQCCzpYzGZszCnDHVjCkdHZRf6KDeg%3D" >> bloblist.txt
你应该能够列出blob。
对于其他任何与403 AuthenticationFailed
相同的azcopy错误,但细节显示Signature size is invalid
- 我尝试从Windows .bat文件脚本azcopy时遇到了同样的问题。当你获得SAS网址时,字符串中会有百分号。从.bat文件运行时,必须将百分号翻倍以“逃避”它们。例如无论你在网址中看到%,请将其设为%% - 希望这会有所帮助!
有趣的是我记得在我写的前3个azcopy脚本中这样做,几个星期之后为新的存储帐户做了第4个,并且无法弄清楚为什么我一直得到403.我想这篇文章将是一个提醒下次我再次忘记:)给自己:)