生成Azure Blob容器SAS URL时遭遇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
相关产品推荐
相关产品推荐

