使用Python客户端凭据从Azure下载Blob遇未授权错误排查
问题
尝试通过Python使用Azure AD客户端凭据下载Azure存储容器中的Blob时,始终收到“Not Authorized”错误,具体情况如下:
- 拥有包含文件的Azure容器;
- 持有带客户端凭据的Azure AD账户;
- 账户已被分配Storage Blob Data Contributor和Storage Blob Data Reader权限;
- 使用以下Python代码执行Blob下载操作时出错,是否遗漏了
get_token方法?
from azure.storage.blob import BlobServiceClient from azure.identity import ClientSecretCredential clientId="xxxxx" clientSecret="xxxxx" tenantId="xxxxx" containerName="xxxxx" account_url="https://xxxxx.blob.core.windows.net" containerName="xxxxx" blobName="xxxxx.txt" token_credential=ClientSecretCredential(tenant_id=tenantId, client_id=clientId, client_secret=clientSecret) blob_service_client=BlobServiceClient(account_url=account_url, credential=token_credential) blob_client=blob_service_client.get_blob_client(container=containerName, blob=blobName) downloader=blob_client.download_blob()
排查方向与解决方案
无需手动调用
get_token:ClientSecretCredential会自动处理令牌的获取和刷新,你的代码里不需要额外调用该方法,这部分逻辑没问题。清理重复权限并确认分配范围:
- 不要同时分配
Storage Blob Data Contributor和Storage Blob Data Reader,权限重叠可能引发异常,保留其中一个即可; - 确认权限是直接分配到存储账户或目标容器层级,而非仅订阅/资源组层级(继承权限虽生效,但优先检查直接分配的有效性)。
- 不要同时分配
核对凭据与地址参数:
- 逐一检查
clientId、clientSecret、tenantId是否与Azure AD应用注册的信息完全一致,避免拼写错误或多余空格; - 确认
account_url格式正确,必须是https://<存储账户名>.blob.core.windows.net,不能包含额外路径或后缀。
- 逐一检查
检查容器访问级别:
- 如果容器设置为私有,需确保没有误开启匿名访问冲突;若为匿名访问,AD凭据仍可正常使用,但需确认容器权限配置未被篡改。
验证Azure AD应用的API权限:
- 在Azure AD应用注册的“API权限”中,确认已添加Azure Storage的
user_impersonation应用权限(注意是“应用权限”而非“委托权限”),且已完成管理员同意操作。
- 在Azure AD应用注册的“API权限”中,确认已添加Azure Storage的
添加错误捕获定位问题:
修改代码增加异常捕获,打印详细错误信息,便于精准定位问题:try: downloader = blob_client.download_blob() content = downloader.readall() print("Blob下载成功") except Exception as e: print(f"错误详情: {str(e)}")
内容的提问来源于stack exchange,提问作者Mayukh Chakravartti
相关产品推荐
相关产品推荐

