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

生成Azure Blob容器SAS URL时遭遇AuthorizationPermissionMismatch错误

Azure Blob容器SAS上传文件遇AuthorizationPermissionMismatch错误解决

我使用Python及Azure SDK为Azure Blob存储容器生成Shared Access Signature(SAS)URL,SAS令牌已成功生成,但尝试上传文件至容器时,收到如下错误:

AuthorizationPermissionMismatch此请求无权使用此权限执行此操作。

RequestId:a6cfe60c-501e-0095-40bf-a00
Time:2024-05-14T05:26:24.9759212Z

生成SAS的代码如下:

def generate_sas_url_for_container(strg_account, credentials, container_name, permissions, validity_hours):
    try:
        # 创建BlobServiceClient
        blob_service_client = BlobServiceClient(account_url=f"https://{strg_account}.blob.core.windows.net/", credential=credentials)

        # 定义SAS权限
        container_permissions = ContainerSasPermissions(read=permissions.read, create=permissions.create, list=permissions.list)
        user_delegation_key = blob_service_client.get_user_delegation_key(datetime.utcnow(), datetime.utcnow() + timedelta(hours=1))

        # 定义SAS过期时间
        expiry = datetime.utcnow() + timedelta(hours=validity_hours)

        # 生成容器SAS令牌
        sas_token = generate_container_sas(
            account_name=blob_service_client.account_name,
            user_delegation_key=user_delegation_key,
            container_name=container_name,
            account_key=None,
            permission=container_permissions,
            expiry=expiry,
            sv="2020-08-04"
        )
        sas_url = f"https://{blob_service_client.account_name}.blob.core.windows.net/{container_name}?{sas_token}"
        return sas_url
    except Exception as e:
        print(f"生成容器SAS URL出错: {e}")
        return None

问题原因及修复方案

1. 缺少文件上传所需权限

容器SAS的create权限仅允许创建容器,上传文件(写入Blob)需要write权限。当前代码未配置该权限,导致上传操作被拒绝。

修复:修改ContainerSasPermissions初始化代码,添加write权限:

container_permissions = ContainerSasPermissions(
    read=permissions.read,
    create=permissions.create,
    list=permissions.list,
    write=True  # 新增上传文件所需的写入权限
)

如果你的permissions对象本身包含write属性,也可以直接传入:

container_permissions = ContainerSasPermissions(
    read=permissions.read,
    create=permissions.create,
    list=permissions.list,
    write=permissions.write
)

2. 用户委托密钥有效期短于SAS有效期

当前代码中,用户委托密钥的有效期仅为1小时,但SAS的有效期由validity_hours决定。如果validity_hours大于1,SAS过期时间会超出密钥有效期,导致权限验证失败。

修复:将用户委托密钥的过期时间与SAS保持一致:

expiry = datetime.utcnow() + timedelta(hours=validity_hours)
# 用SAS的过期时间作为密钥的过期时间
user_delegation_key = blob_service_client.get_user_delegation_key(datetime.utcnow(), expiry)

3. 验证生成SAS的凭据权限

如果使用Azure AD凭据生成用户委托SAS,确保凭据拥有以下RBAC权限之一:

  • Storage Blob Data Contributor:完整Blob数据操作权限
  • Storage Account Contributor:账户级管理权限
  • Storage Blob Delegator:生成用户委托SAS的最小权限
    如果使用存储账户密钥,默认账户密钥已拥有全部权限,无需额外配置。

内容的提问来源于stack exchange,提问作者Mr. Annonymous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:23:11