You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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()
排查方向与解决方案
  1. 无需手动调用get_token:ClientSecretCredential会自动处理令牌的获取和刷新,你的代码里不需要额外调用该方法,这部分逻辑没问题。

  2. 清理重复权限并确认分配范围:

    • 不要同时分配Storage Blob Data Contributor和Storage Blob Data Reader,权限重叠可能引发异常,保留其中一个即可;
    • 确认权限是直接分配到存储账户或目标容器层级,而非仅订阅/资源组层级(继承权限虽生效,但优先检查直接分配的有效性)。
  3. 核对凭据与地址参数:

    • 逐一检查clientId、clientSecret、tenantId是否与Azure AD应用注册的信息完全一致,避免拼写错误或多余空格;
    • 确认account_url格式正确,必须是https://<存储账户名>.blob.core.windows.net,不能包含额外路径或后缀。
  4. 检查容器访问级别:

    • 如果容器设置为私有,需确保没有误开启匿名访问冲突;若为匿名访问,AD凭据仍可正常使用,但需确认容器权限配置未被篡改。
  5. 验证Azure AD应用的API权限:

    • 在Azure AD应用注册的“API权限”中,确认已添加Azure Storage的user_impersonation应用权限(注意是“应用权限”而非“委托权限”),且已完成管理员同意操作。
  6. 添加错误捕获定位问题:
    修改代码增加异常捕获,打印详细错误信息,便于精准定位问题:

    try:
        downloader = blob_client.download_blob()
        content = downloader.readall()
        print("Blob下载成功")
    except Exception as e:
        print(f"错误详情: {str(e)}")
    

内容的提问来源于stack exchange,提问作者Mayukh Chakravartti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:58:24