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

使用SAS Token通过Java连接Azure容器时出现403认证失败问题

问题解决:Azure Blob SAS Token 签名不匹配(403 AuthenticationFailed)

错误根源

你的代码中Endpoint设置错误:将虚拟目录subcontainer直接追加到容器Endpoint中,导致SDK生成签名时使用的资源路径与SAS Token对应的资源不匹配。

Azure Blob存储中没有真正的"子容器"概念,subcontainer本质是虚拟目录,SAS Token是针对顶级容器mycontainername生成的,但你的代码把Endpoint设为https://mycontainername.blob.core.windows.net/subcontainer,SDK会认为目标资源是名为subcontainer的容器,而非顶级容器下的虚拟目录,最终导致签名校验失败。

修正方案

1. 修正Endpoint配置

将Endpoint改为顶级容器的地址,SAS Token保持不变:

BlobContainerClient container = new BlobContainerClientBuilder()
        .endpoint("https://mycontainername.blob.core.windows.net")
        .sasToken("sv=2020-10-02&st=2024-03-11T13:58:42Z&se=2024-03-12T14:03:42Z&sr=c&sp=racwl&sig=HVoBAVRrDWaEY1KDr0oxUCFXS8R63L%2B7S5X8n457LTA%3D")
        .buildClient();

2. 访问虚拟目录下的Blob

如果需要操作subcontainer下的Blob,通过前缀过滤实现:

// 列出subcontainer目录下的所有Blob(包括子目录内容)
ListBlobsOptions options = new ListBlobsOptions()
        .setPrefix("subcontainer/")
        .setIncludeDetails(true);

long count = container.listBlobs(options, Duration.ofSeconds(30)).stream().count();

为什么浏览器访问正常?

浏览器拼接的URL中指定了restype=container,实际是向顶级容器mycontainername发起请求,subcontainer被服务器解析为虚拟目录路径而非容器名称,因此签名校验可以通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:58:20