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

Azure APIM策略生成Storage Account容器SAS令牌失败求助

Azure APIM策略生成SAS令牌身份验证失败排查与修复

以下是你的代码中存在的关键问题及对应修复方案:

1. 规范化资源变量语法错误

canonicalizedResource代码存在语法错误,多余的string)导致变量值无法正确生成:
错误代码:

<set-variable name="canonicalizedResource" value="@{
    return string.Format(\"/{0}/{1}\",(string)context.Variables[\"storageAccount\"],    
    string)context.Variables[\"resourcePath\"]);
    }" />

修复后:

<set-variable name="canonicalizedResource" value="@{
    return string.Format(\"/{0}/{1}\", (string)context.Variables[\"storageAccount\"], (string)context.Variables[\"resourcePath\"]);
}" />

2. SAS签名字符串(stringToSign)格式错误

Azure存储SAS的签名字符串有严格的顺序要求,未使用的可选参数必须留空行。你的代码遗漏了signedIdentifier和signedIP对应的空行,导致签名计算错误。

修复后的stringToSign代码:

<set-variable name="stringToSign" value="@{
    return string.Format(\"{0}\\n{1}\\n{2}\\n{3}\\n\\n\\n{4}\\n{5}\\n{6}\",
        (string)context.Variables[\"signedPermissions\"],                
        (string)context.Variables[\"signedStart\"],
        (string)context.Variables[\"signedExpiry\"],
        (string)context.Variables[\"canonicalizedResource\"],
        (string)context.Variables[\"signedProtocol\"],
        (string)context.Variables[\"signedVersion\"],
        (string)context.Variables[\"signedResource\"]);
}" />

3. 存储版本不一致

代码中x-ms-version使用2022-11-02,但signedVersion为2021-10-04,版本不一致可能引发兼容性问题,建议统一使用较新版本:

<set-variable name="signedVersion" value="2022-11-02" />

4. 固定时间的时间偏差问题

硬编码的signedStart和signedExpiry可能因客户端与Azure服务器的时间差导致验证失败,建议使用动态计算的UTC时间:

<set-variable name="signedStart" value="@(DateTime.UtcNow.AddMinutes(-5).ToString(\"yyyy-MM-ddTHH:mm:ssZ\"))" />
<set-variable name="signedExpiry" value="@(DateTime.UtcNow.AddHours(24).ToString(\"yyyy-MM-ddTHH:mm:ssZ\"))" />

完整修复后的策略代码片段

<set-variable name="accessKey" value="{{accessKey}}" />
<set-variable name="resourcePath" value="@(context.Request.Headers.GetValueOrDefault(\"containerName\"))" />
<set-variable name="x-ms-date" value="@(DateTime.UtcNow.ToString(\"R\"))" />
<set-variable name="x-ms-version" value="2022-11-02" />
<set-variable name="signedPermissions" value="rw" />
<set-variable name="signedStart" value="@(DateTime.UtcNow.AddMinutes(-5).ToString(\"yyyy-MM-ddTHH:mm:ssZ\"))" />
<set-variable name="signedExpiry" value="@(DateTime.UtcNow.AddHours(24).ToString(\"yyyy-MM-ddTHH:mm:ssZ\"))" />
<set-variable name="signedResource" value="c" />
<set-variable name="signedVersion" value="2022-11-02" />
<set-variable name="canonicalizedResource" value="@{
    return string.Format(\"/{0}/{1}\", (string)context.Variables[\"storageAccount\"], (string)context.Variables[\"resourcePath\"]);
}" />
<set-variable name="signedProtocol" value="https" />
<set-variable name="stringToSign" value="@{
    return string.Format(\"{0}\\n{1}\\n{2}\\n{3}\\n\\n\\n{4}\\n{5}\\n{6}\",
        (string)context.Variables[\"signedPermissions\"],                
        (string)context.Variables[\"signedStart\"],
        (string)context.Variables[\"signedExpiry\"],
        (string)context.Variables[\"canonicalizedResource\"],
        (string)context.Variables[\"signedProtocol\"],
        (string)context.Variables[\"signedVersion\"],
        (string)context.Variables[\"signedResource\"]);
}" />
<set-variable name="signature" value="@{
    System.Security.Cryptography.HMACSHA256 hasher = new System.Security.Cryptography.HMACSHA256(Convert.FromBase64String((string)context.Variables[\"accessKey\"]));
    return Convert.ToBase64String(hasher.ComputeHash(System.Text.Encoding.UTF8.GetBytes((string)context.Variables[\"stringToSign\"])));
}" />

额外检查点

  • 确认storageAccount变量已正确定义,值为你的存储账户名称
  • 确认请求头containerName存在且值为有效的容器名称(无多余斜杠、空格)
  • 确认accessKey是存储账户的有效访问密钥(不是完整连接字符串)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:50:06