我一直在研究概念证明,并正在尝试针对Azure存储REST API进行测试。但是,我无法验证。我一整天都在尝试阅读,调整和改写,但仍然无法正常工作。我一直在逐步完成文档。Azure Blob存储REST API签名
我希望找到管理这个的人。大量的硬编码位,它只是让它工作。我不断收到此错误回响应
在HTTP请求“中发现的MAC签名”是不一样的任何计算签名
任何人都可以看到什么是可能的盯着我的脸?这让我很生气。
var requestDateString = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);
var StorageAccountName = "<account removed>";
var StorageKey = "<key removed>";
using (var client = new HttpClient())
{
var stringToSign = new List<string>(){
"GET" /*HTTP Verb*/
,"" /*Content-Encoding*/
,"" /*Content-Language*/
,"" /*Content-Length (include value when zero)*/
,"" /*Content-MD5*/
,"" /*Content-Type*/
,"" /*Date*/
,"" /*If-Modified-Since */
,"" /*If-Match*/
,"" /*If-None-Match*/
,"" /*If-Unmodified-Since*/
,"" /*Range*/
,$"x-ms-date:{requestDateString}\nx-ms-version:2015-02-21" /*CanonicalizedHeaders*/
,$"/{StorageAccountName}/ " + _containerName + "\ncomp:metadata\nrestype:container\ntimeout:20" /*CanonicalizedResource*/
};
string signature;
using (var hmac = new HMACSHA256(Convert.FromBase64String(StorageKey)))
{
var compiledStringToSign = (string.Join("\n", stringToSign));
byte[] dataToHmac = Encoding.UTF8.GetBytes(compiledStringToSign);
signature = Convert.ToBase64String(hmac.ComputeHash(dataToHmac));
}
//Send Request
client.DefaultRequestHeaders.Add("x-ms-date", requestDateString);
client.DefaultRequestHeaders.Add("x-ms-version", " 2015-02-21");
client.DefaultRequestHeaders.Add("Authorization", $"SharedKey {StorageAccountName}:" + signature);
var response = client.SendAsync(request);
//编辑 请求的URL是https://account.blob.core.windows.net/testcontainer/blobtest/blob1234
的错误是非常具体的关于身份验证失败,所以我认为,误差必须在签名,我真的不能看到它虽然。我检查了所有的输出与小提琴手,以确保它们匹配
我可以问你为什么不使用Azure存储SDK为C#? –
当没有SDK时,我曾经在Python中实现过这个功能。 AFAIK C#SDK在GitHub上是开源的,您可以查看代码 - 两年前,我发现该实现非常易读 –
您是否也可以共享请求URL? –