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

使用连接字符串跨容器复制Azure Blob时认证失败求助

问题分析与解决方案

为什么连接字符串不足以完成认证?

start_copy_from_url是Azure存储的服务器端复制操作:调用该方法时,是让Azure存储服务直接从源Blob的URL拉取数据并复制到目标Blob。这个过程中,存储服务不会使用客户端BlobServiceClient的连接字符串凭证去访问源Blob——它仅依赖你提供的源URL本身包含的认证信息。

如果源URL仅为blob_client.url(不带SAS或其他认证参数),存储服务访问源Blob时没有权限凭证,就会返回401 NoAuthenticationInformation错误。而添加SAS Token后,源URL包含了临时权限凭证,存储服务就能正常访问源Blob完成复制。

仅使用连接字符串完成复制的两种方案

方案1:源与目标Blob在同一存储账户

若源和目标属于同一个存储账户,无需提供完整源URL,直接使用存储账户内的相对路径即可。此时Azure存储服务会通过账户内部权限验证,无需额外认证信息:

# 假设已通过连接字符串创建目标BlobClient(target_blob_client)
source_container_name = "blbcon-common-customer-documents"
source_blob_name = "你的源Blob名称"

# 使用账户内相对路径作为源
source_path = f"/{source_container_name}/{source_blob_name}"
target_blob_client.start_copy_from_url(source_path)

方案2:源与目标Blob在不同存储账户

若源和目标属于不同存储账户,可通过连接字符串自动生成临时SAS Token(无需手动配置环境变量中的SAS):

from azure.storage.blob import BlobSasPermissions, generate_blob_sas
from datetime import datetime, timedelta
import os

# 用连接字符串创建源BlobClient
source_connection_string = os.getenv("SOURCE_STORAGE_CONNECTION_STRING")
source_blob_client = BlobClient.from_connection_string(
    conn_str=source_connection_string,
    container_name="blbcon-common-customer-documents",
    blob_name="你的源Blob名称"
)

# 生成临时SAS Token(仅授予读取权限,有效期1小时)
sas_token = generate_blob_sas(
    account_name=source_blob_client.account_name,
    container_name=source_blob_client.container_name,
    blob_name=source_blob_client.blob_name,
    account_key=source_blob_client.credential.account_key,
    permission=BlobSasPermissions(read=True),
    expiry=datetime.utcnow() + timedelta(hours=1)
)

# 拼接带SAS的源URL
source_url_with_sas = f"{source_blob_client.url}?{sas_token}"

# 发起复制操作
target_blob_client.start_copy_from_url(source_url_with_sas)

该方案中,SAS Token由连接字符串中的账户密钥自动生成,无需手动维护外部凭证,满足你不想部署时使用手动配置SAS的需求。

内容的提问来源于stack exchange,提问作者Siri Mudunuri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:55:16