我正在尝试生成帐户SAS令牌: MSDN DOC
当我尝试使用生成的令牌时,我得到以下内容:
AuthenticationFailed
服务器无法验证请求。确保正确形成Authorization标头的值,包括签名。 请求ID:89959111-0001-00c8-24d1-e0515b000000 时间:2016-07-18T08:49:00.8383767Z 签名不匹配。要使用的字符串是[accountName] RL b SC 2017年1月1日 2015年4月5日
以下是我的代码:
var signedVersion = "2015-04-05";
var signedServices = "b";
var signedResourceTypes = "sc";
var signedPermission = "rl";
var signedExpiry = "2017-01-01";
var stringToSign =
accountName + "\n" +
signedPermission + "\n" +
signedServices + "\n" +
signedResourceTypes + "\n" +
signedExpiry + "\n" +
signedVersion + "\n"
;
var keyBytes = Encoding.UTF8.GetBytes(accountKey);
byte[] hash;
using (var mac = new HMACSHA256(keyBytes))
{
var stringToSignBytes = Encoding.UTF8.GetBytes(stringToSign);
hash = mac.ComputeHash(stringToSignBytes);
}
var str = Convert.ToBase64String(hash);
var sig = HttpUtility.UrlEncode(str);
var url = $"https://{accountName}.blob.core.windows.net/?comp=list&sv={signedVersion}&ss={signedServices}&srt={signedResourceTypes}&sp={signedPermission}&se={signedExpiry}&sig={sig}";
我做错了什么?
答案 0 :(得分:3)
我注意到代码存在一些问题:
首先,要将帐户密钥转换为字节数组,您需要使用Convert.FromBase64String(accountKey)
而不是Encoding.UTF8.GetBytes(accountKey);
。
接下来,即使您没有使用开始时间,签名协议和签名的IP地址,也需要将它们包含在stringToSign
中。
一旦你做了这些事情,代码就可以了。基于这些,我在下面包含了修改后的代码。我测试了它是否在我的存储帐户中列出容器并且它可以正常工作。
static void AccountSas()
{
var signedVersion = "2015-04-05";
var signedServices = "b";
var signedResourceTypes = "sc";
var signedPermission = "rl";
var signedExpiry = "2017-01-01";
var signedStart = "";
var signedIP = "";
var signedProtocol = "";
var stringToSign =
accountName + "\n" +
signedPermission + "\n" +
signedServices + "\n" +
signedResourceTypes + "\n" +
signedStart + "\n" +
signedExpiry + "\n" +
signedIP + "\n" +
signedProtocol + "\n" +
signedVersion + "\n"
;
var keyBytes = Convert.FromBase64String(accountKey);
byte[] hash;
using (var mac = new HMACSHA256(keyBytes))
{
var stringToSignBytes = Encoding.UTF8.GetBytes(stringToSign);
hash = mac.ComputeHash(stringToSignBytes);
}
var str = Convert.ToBase64String(hash);
var sig = HttpUtility.UrlEncode(str);
var url = string.Format("https://{0}.blob.core.windows.net/?comp=list&sv={1}&ss={2}&srt={3}&sp={4}&se={5}&sig={6}", accountName, signedVersion, signedServices, signedResourceTypes, signedPermission, signedExpiry, sig);
}