APIM Policy(C#)调用Azure Table Storage遇403认证失败求助
问题分析与解决方案
我仔细对比了你的C# APIM策略和PHP代码,发现了几个导致签名生成错误的关键点,正是这些问题引发了403认证失败:
1. 时间格式错误(12小时制 vs 24小时制)
你的C#代码里用了hh(12小时制)来格式化小时,但Azure要求的RFC1123时间格式必须用24小时制(HH)。PHP代码里用的H:i:s是正确的24小时制,两者生成的时间字符串不一致,直接导致签名验证失败。
2. 签名字符串拼接缺少换行符
在构建stringToSign时,PHP代码是把路径作为数组最后一个元素,用\n连接,最终格式符合Azure的规范:
GET [date] /account/table
而你的C#代码是直接把路径追加在日期后面,没有加换行,变成了不符合规范的格式:
GET [date]/account/table
这会让Azure无法正确解析签名内容。
3. HMAC算法类名拼写错误
代码里写的HMACSH256是错误的,正确的类名应该是HMACSHA256(少了一个字母"A"),这个错误会导致生成的哈希值完全错误,自然无法通过认证。
修正后的APIM C#策略
<set-variable name="presentTime" value="@( DateTime.UtcNow.ToString("ddd, dd MMM yyyy HH:mm:ss ") + "GMT" )" /> <set-variable name="getTableEntityToken" value="@{ var storage_account = "XXXXXX"; var table = "XXXXXXXX"; var access_key = "XXXXXXXXXXXXXXXXXXXXXXXXXX"; var canonicalized_resource = "/" + storage_account + "/" + table; string[] stringToSignArray = { // VERB "GET", // Content-MD5 "", // Content-Type "", // Date context.Variables.GetValueOrDefault<string>("presentTime"), // Canonicalized Resource canonicalized_resource }; string stringToSign = String.Join("\n", stringToSignArray); using (var encoder = new HMACSHA256(Convert.FromBase64String(access_key))) { var hash = encoder.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)); var signature = Convert.ToBase64String(hash); return signature; } }" /> <set-header name="Authorization" exists-action="override"> <value>@( "SharedKey " + "XXXXXXX:" + context.Variables.GetValueOrDefault<string>("getTableEntityToken") )</value> </set-header> <set-header name="x-ms-date" exists-action="override"> <value>@( context.Variables.GetValueOrDefault<string>("presentTime") )</value> </set-header> <set-header name="x-ms-version" exists-action="override"> <value>2015-12-11</value> </set-header> <set-header name="Accept" exists-action="override"> <value>application/json;odata=nometadata</value> </set-header>
关键修正点说明:
- 把时间格式的
hh改为HH,确保生成符合要求的24小时制时间字符串 - 将
canonicalized_resource加入到stringToSignArray数组中,通过String.Join自动添加换行符,保证签名字符串格式完全匹配PHP版本的逻辑 - 修正了HMAC算法类名为
HMACSHA256,确保哈希计算正确
替换掉对应的账户、表名和密钥后测试,应该能解决403认证失败的问题。
内容的提问来源于stack exchange,提问作者ssk3
相关产品推荐
相关产品推荐

