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

如何使用SAS Token通过azure-storage-cpp SDK连接Blob容器

问题根因

你的配置逻辑存在两个核心错误,和SDK版本无关:

  1. 持有的是容器级SAS(SAS参数里sr=c即代表授权范围为单个容器),本身不具备账号级操作权限,无法调用get_root_container_reference()这类访问账号层级资源的接口。
  2. 错误将容器名拼接至Blob服务全局Endpoint,会导致SDK后续生成请求URI时出现路径重复。
正确配置方式

实现效果完全等同于Storage Explorer中「附加到单个Blob容器+SAS认证」模式,不需要切换新版SDK,配置步骤如下:

  • 初始化cloud_storage_account时,Blob Endpoint填写存储账号的标准Blob服务根地址,不要追加容器名后缀
  • 不要调用根容器获取、全容器列举等账号级接口,通过Blob客户端直接获取目标容器spool的引用即可
  • 后续所有Blob操作都基于该容器引用执行,和你原有存量代码的容器操作逻辑完全兼容

对应可直接运行的代码示例:

#include <azure/storage/cloud_storage_account.h>
#include <azure/storage/cloud_blob_client.h>
#include <cpprest/uri.h>

// 初始化SAS凭据,保持原有SAS参数即可,注意SAS字符串开头保留?
auto sas_cred = azure::storage::storage_credentials::sas_credential(
    L"?sp=racwdl&st=2022-06-20T08%3A49%3A39Z&se=2022-06-27T16%3A49%3A39Z&spr=https&sv=2021-06-08&sr=c&sig=...."
);
azure::storage::storage_credentials storage_cred(sas_cred);

// Blob Endpoint填写账号根地址,不要加/spool后缀
azure::storage::storage_uri blob_endpoint(web::http::uri(U("https://cp.blob.core.windows.net/")));
azure::storage::cloud_storage_account storage_account(
    storage_cred,
    blob_endpoint,
    azure::storage::storage_uri(), // 队列、表、文件endpoint留空即可
    azure::storage::storage_uri(),
    azure::storage::storage_uri()
);

if (storage_account.is_initialized())
{
    azure::storage::cloud_blob_client blob_client = storage_account.create_cloud_blob_client();
    // 直接获取目标容器引用,不要调用get_root_container_reference()
    azure::storage::cloud_blob_container spool_container = blob_client.get_container_reference(U("spool"));
    
    // 后续直接操作spool_container即可,比如判断存在、列举Blob、上传下载,和原有逻辑一致
    // 测试示例:验证容器连通性
    bool container_exist = spool_container.exists().get();
}
三类异常的对应原因
  • 请求URI不匹配资源:之前将容器名拼入Endpoint后,SDK生成请求时会再次追加容器/Blob路径,最终得到类似https://cp.blob.core.windows.net/spool/spool/xxx的错误路径
  • 无操作权限:调用get_root_container_reference()实际访问的是账号下的$root特殊容器,你的SAS仅授权spool容器的访问权限,自然会被拒绝
  • Authorization头校验失败:如果SAS字符串开头漏写?、SAS被二次URL编码、容器名位置拼接错误,都会导致服务端签名校验不通过

注意:容器级SAS的权限边界严格限定在指定容器范围内,所有跨容器、账号级的操作都会被服务端拒绝,这是SAS本身的权限设计,不是配置错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:31:09