使用Python SDK访问Azure容器遇AuthorizationPermissionMismatch错误
问题概述
作为Azure Storage容器所有者,通过Azure GUI可正常查看容器内容,但使用Python SDK结合DefaultAzureCredential调用list_blob_names()时,返回403错误,错误码为AuthorizationPermissionMismatch,且SDK已确认通过AzureCliCredential获取到身份。
解决步骤
1. 确认Azure CLI登录账户与订阅正确性
日志显示脚本使用AzureCliCredential认证,但可能CLI登录账户或订阅与目标存储账户不匹配:
- 在PowerShell中执行:
az account show,核对输出的订阅ID、账户名称是否与存储账户所在订阅一致。 - 若不一致,执行
az login重新登录正确账户,或用az account set --subscription <目标订阅ID>切换到正确订阅。
2. 检查存储账户RBAC权限配置
即使是容器所有者,也需确保账户拥有Blob列表操作的具体RBAC权限:
- 登录Azure Portal,进入目标存储账户,选择访问控制(IAM) → 角色分配。
- 搜索你的账户,确认是否分配了
Storage Blob Data Reader或Storage Blob Data Contributor这类包含Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read权限的角色。 - 若无对应权限,点击添加 → 添加角色分配,选择
Storage Blob Data Reader角色,指定你的账户为成员后保存。
3. 排查存储账户防火墙/虚拟网络限制
若存储账户设置了网络访问限制,本地机器IP不在允许列表会导致权限拒绝:
- 进入存储账户的网络设置,查看“允许访问的网络”配置:
- 若为“选定的网络”,检查“防火墙”下的允许IP列表是否包含你的本地公网IP;
- 可临时切换为“所有网络”测试脚本是否正常运行(测试完成后恢复原配置)。
4. 显式指定AzureCliCredential认证
避免DefaultAzureCredential尝试其他认证方式的干扰,修改代码直接使用AzureCliCredential:
from azure.identity import AzureCliCredential from azure.storage.blob import ContainerClient if __name__ == "__main__": client = ContainerClient( credential=AzureCliCredential(), account_url="https://satestblobaccess.blob.core.windows.net", container_name="stcnt-test-blob-access" ) blob_names = client.list_blob_names() print([b for b in blob_names])
执行前确保已通过az login登录正确账户,并切换到目标订阅。
5. 验证认证令牌的权限范围
检查Azure CLI获取的令牌是否包含Blob列表权限:
- 执行命令获取令牌:
az account get-access-token --resource https://storage.azure.com/ --query "accessToken" -o tsv - 使用本地JWT解码工具(如Python的
pyjwt库)解码令牌,查看scp或roles声明中是否包含storage:BlobContainers.List或相关权限。
内容的提问来源于stack exchange,提问作者Ytsen de Boer
相关产品推荐
相关产品推荐

