如何在C#中使用SAS Token连接Azure BlobStorage并解决认证报错
问题核心原因
你当前使用的是容器级SAS(仅授权访问指定单个容器),而你尝试的所有写法都是先构造对应整个存储账户的CloudStorageAccount实例,该实例默认会发起账户级别的权限校验,自然会触发认证失败。
正确实现方案
方案1:直接用已验证的SAS URL构造容器实例(最推荐,无需处理连接字符串格式)
你已经确认<Blob-SAS-URL>可以在Azure Storage Explorer中正常使用,直接用这个URL初始化容器对象即可:
// 填入你实际的Blob SAS URL(即<DefaultEndpointsProtocol>://<StorageAccount>.blob.<EndpointSuffix>/<Container>?<Blob-SAS-Token>) var containerUri = new Uri("<你的Blob SAS URL>"); var blobContainer = new CloudBlobContainer(containerUri); // 后续直接使用blobContainer对象操作该容器即可,比如枚举Blob、上传下载文件等 // 示例:列出容器下所有Blob var blobList = blobContainer.ListBlobs();
注意:不要用这个容器实例的父级Client去调用枚举所有存储容器、访问其他容器这类账户级接口,你的SAS没有对应权限。
方案2:如果需要使用连接字符串形式接入,需调整两个细节
- 先处理SAS Token:去掉Token开头的
?符号,比如你的SAS Token是?sv=2021-10-04&st=...,处理后只保留sv=2021-10-04&st=...部分。 - 连接字符串使用以下格式,不要在BlobEndpoint后加容器路径:
BlobEndpoint=<DefaultEndpointsProtocol>://<StorageAccount>.blob.<EndpointSuffix>;SharedAccessSignature=<处理后的SAS Token>
- 初始化客户端后,仅操作你有权限的对应容器即可:
var storageAccount = CloudStorageAccount.Parse(connectionString); var blobClient = storageAccount.CreateCloudBlobClient(); // 仅访问你SAS授权的容器,不要操作其他容器或调用账户级接口 var targetContainer = blobClient.GetContainerReference("<Container>");
补充排查点
如果你坚持要直接构造CloudStorageAccount实例做全账户操作,你需要将当前的容器级SAS替换为账户级SAS,账户级SAS才具备整个存储账户的访问权限,适配你之前的构造写法。
内容的提问来源于stack exchange,提问作者F-H
相关产品推荐
相关产品推荐

