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

.NET Core 3.1使用Azure.Storage.Blobs生成SAS令牌遇认证失败问题

解决Azure Blob SAS令牌认证失败问题

我仔细看了你的代码,发现几个关键错误导致SAS令牌无法通过认证,下面逐一说明并给出修正方案:

核心错误点分析

  • StorageSharedKeyCredential参数错误:你创建StorageSharedKeyCredential时传入的第一个参数是容器名containername,但这个参数必须是存储账户名——SAS签名是基于账户密钥和账户名生成的,用容器名会直接导致签名无效。
  • UriBuilder的Host设置错误:Host部分你写的是containername.blob.core.windows.net,正确格式应该是{你的存储账户名}.blob.core.windows.net,容器名是URL路径的一部分,不是主机名。
  • UriBuilder的Path不匹配:你手动写了"blobtest/file.bmp",但这个路径必须和BlobSasBuilder中指定的BlobContainerName、BlobName完全对应,否则授权的资源和访问路径不一致,自然会认证失败。

修正后的完整代码

string sastoken = "";
BlobServiceClient blobServiceClient = new BlobServiceClient("DefaultEndpointsProtocol=https;AccountName=accountname;AccountKey=accountkey;EndpointSuffix=core.windows.net");
string containerName = "containername"; // 替换为你的实际容器名
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName);

BlobSasBuilder sasBuilder = new BlobSasBuilder() {
    ExpiresOn = DateTime.UtcNow + TimeSpan.FromHours(24),
    BlobContainerName = containerName,
    BlobName = imageData.filename, // 确保与目标Blob文件名一致
    Resource = "b" // "b"代表授权单个Blob,配置正确
};
sasBuilder.SetPermissions(BlobSasPermissions.Read);

// 修正:第一个参数改为存储账户名
sastoken = sasBuilder.ToSasQueryParameters(new StorageSharedKeyCredential("accountname", "accountkey")).ToString();

UriBuilder fulluri = new UriBuilder() {
    Scheme = "https",
    // 修正:Host使用存储账户名
    Host = $"{accountname}.blob.core.windows.net",
    // 修正:路径与SAS授权的容器、Blob完全对应
    Path = $"{containerName}/{imageData.filename}",
    Query = sastoken
};
imageData.url = fulluri.Uri.ToString();

额外验证小技巧

  • 生成URL后,直接复制到浏览器访问,看是否能正常下载Blob,快速排除代码外的配置问题。
  • 检查imageData.filename是否包含特殊字符,虽然UriBuilder会自动处理编码,但如果是手动拼接路径需要注意。
  • 确认存储账户密钥accountkey没有复制错误,比如多余空格或字符缺失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:07:43