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

使用SAS令牌访问Storage Emulator中Blob容器时认证失败求助

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

首先来看你遇到的认证错误:

Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature

对应的异常堆栈也指向了GetPropertiesAsync调用时的403错误,结合你的复现代码,我发现了几个关键问题:

核心问题分析

1. StorageSharedKeyCredential参数顺序颠倒了

你代码里的这一行把账户名和密钥的顺序搞反了:

StorageSharedKeyCredential credential = new StorageSharedKeyCredential("Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==", "devstoreaccount1");

StorageSharedKeyCredential的构造函数第一个参数是存储账户名,第二个才是账户密钥。Storage Emulator的默认账户名是devstoreaccount1,对应的密钥是Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==,顺序错了肯定会导致签名验证失败。

2. 未设置StartsOn参数可能引发时钟偏差问题

你注释掉了StartsOn = DateTimeOffset.UtcNow,虽然设置了ExpiresOn = DateTimeOffset.MaxValue,但如果本地时钟和Storage Emulator的时钟有微小偏差,可能会导致SAS令牌被判定为尚未生效,从而触发认证失败。

修正后的代码

BlobSasBuilder sasBuilder = new BlobSasBuilder
{
    BlobContainerName = "myTestContainer",
    Resource = "c", // 代表容器,这个配置是正确的
    StartsOn = DateTimeOffset.UtcNow.AddMinutes(-5), // 提前5分钟设置生效时间,规避时钟偏差问题
    ExpiresOn = DateTimeOffset.UtcNow.AddHours(1) // 不建议用MaxValue,合理设置过期时间更安全
};

// 授予容器读取权限
sasBuilder.SetPermissions(BlobContainerSasPermissions.Read);

// 修正参数顺序:账户名在前,密钥在后
StorageSharedKeyCredential credential = new StorageSharedKeyCredential("devstoreaccount1", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==");

// 生成SAS令牌
string sasToken = sasBuilder.ToSasQueryParameters(credential).ToString();
Console.WriteLine("SAS for blob container is: {0}", sasToken);
Console.WriteLine();

// 构建SAS URI
UriBuilder sasUri = new UriBuilder(containerClient.Uri);
sasUri.Query = sasToken;

// 使用SAS URI创建客户端
BlobServiceClient service = new BlobServiceClient(sasUri.Uri);

// 验证认证是否成功
await service.GetPropertiesAsync();

额外注意事项

  • 确保Storage Emulator正在运行,且你使用的是默认的账户名和密钥(Storage Emulator不支持自定义账户密钥)。
  • 如果还是有问题,可以检查你的请求URL是否正确,确保指向的是Storage Emulator的默认端点(http://127.0.0.1:10000/devstoreaccount1)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:57:42