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

如何用Python旧版Azure存储SDK无账户密钥生成SAS令牌?

解决方案说明

旧版SDK(1.5.0)的局限性

azure-storage-blob 1.5.0属于早期版本,不支持通过托管身份直接生成SAS令牌,也没有实现用户委托SAS相关API(该特性是v12.0.0及以上版本才引入的)。旧版BlockBlobService生成SAS的方法(如generate_blob_shared_access_signature)必须依赖存储账户密钥或已有共享访问签名,无法直接通过托管身份令牌完成。

可行替代方案(不升级SDK的情况下)

如果暂时无法升级SDK,可以尝试以下两种方式:

1. 通过托管身份获取账户密钥后生成SAS

  • 确保你的用户分配托管身份拥有Storage Account Key Operator Service Role权限(允许读取存储账户密钥)。
  • 使用MSI获取访问Azure资源管理API的令牌,调用GET /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}/listKeys?api-version=2021-04-01接口获取账户密钥。
  • 拿到密钥后传入BlockBlobService,调用generate_blob_shared_access_signature生成SAS令牌。

这种方式需要额外API调用,且依赖密钥读取权限,安全性不如用户委托SAS。

2. 直接使用托管身份令牌访问Blob

如果业务允许,不必生成SAS,直接用托管身份获取的令牌作为Blob访问凭证:

  • 用托管身份获取针对存储账户的访问令牌(资源标识为https://storage.azure.com/)。
  • 构建Blob访问URL时,将令牌作为Authorization头的Bearer令牌,或附加到URL参数中(有效期受限于令牌过期时间,灵活性不如SAS)。

最终建议

如果核心需求是生成用户委托SAS(基于身份的SAS,无需暴露账户密钥),或者想长期维护代码的兼容性和安全性,升级到新版SDK是唯一可靠的解决方案。

注意:Python 3.6在azure-storage-blob v12.8.0及以上版本不再被支持,可选择安装支持Python 3.6的最高版本(如v12.7.0),该版本已实现用户委托SAS完整功能,且兼容Python 3.6。升级后可通过BlobServiceClient结合托管身份获取用户委托密钥,进而生成用户委托SAS。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:15:46