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

使用Azure.Storage.Blob生成SAS Token而非SAS URI及SharedKeyLite认证问题

Azure.Storage.Blob返回SAS URI而非纯Token的说明

Azure.Storage.Blob库默认返回完整SAS URI是产品原生设计,覆盖绝大多数直接访问资源的业务场景。如果需要单独获取纯SAS Token,直接截取SAS URI中?之后的全部字符串即可,无需额外编码生成。

SharedKeyLite签名报错的根因与修复方案

你当前的签名逻辑存在3个明确问题:

  • 签名字符串构造时多写了多余的$符号:\n${canonicalizedResource}的$属于插值语法残留,会导致服务端拿到的签名和本地计算结果不匹配
  • canonicalicalizedResource构造不符合规范:SharedKeyLite要求该值格式为/{存储账户名}/{容器名}/{Blob路径},不能携带域名、查询参数等多余内容
  • 请求头x-ms-date的值和签名时使用的时间不一致:签名时的UTC时间必须和x-ms-date头的取值完全相同,差1秒都会导致验证失败

修复后的代码示例:

// 按规范构造资源路径,示例:/mystorage/mycontainer/test.txt
var canonicalizedResource = $"/{storageAccountName}/{containerName}/{blobPath}";
// 提前声明时间变量,保证签名和请求头用的时间完全一致
var utcDate = DateTimeOffset.UtcNow.ToString("R", CultureInfo.InvariantCulture);
// 去掉多余的$符号
var stringToSign = $"{utcDate}\n{canonicalizedResource}";
using var hmac = new HMACSHA256(Convert.FromBase64String(storageAccountKey));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
return Convert.ToBase64String(hash);

请求时需要严格遵守以下规则:

  • 请求头x-ms-date必须传入代码中生成的utcDate变量值,不可重新生成时间
  • 若升级x-ms-version到更高版本,需要同步核对签名规则是否有调整,2014-02-14版本可直接使用上述代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 14:12:04