使用Azure.Storage.Blob生成SAS Token而非SAS URI及SharedKeyLite认证问题
Azure.Storage.Blob返回SAS URI而非纯Token的说明
Azure.Storage.Blob库默认返回完整SAS URI是产品原生设计,覆盖绝大多数直接访问资源的业务场景。如果需要单独获取纯SAS Token,直接截取SAS URI中?之后的全部字符串即可,无需额外编码生成。
你当前的签名逻辑存在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
相关产品推荐
相关产品推荐

