2017-05-12 9 views
0

Rest APIのおかげでAzure Blobサービスと通信するアプリケーションでPut Append操作でのみ発生したエラーを調べています。BlobサービスレストAPIを使用したAppend Block操作 - 403認証エラー

ファイルの作成が成功したが、それはアペンドブロブだから、私は追加のブロック操作でコンテンツを追加しなければならなかったと私はそうしようとしたとき、私は403禁止WebExceptionを取得しています:

<?xml version="1.0" encoding="utf-8"?><Error><Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. 
RequestId:00dc0116-0001-00c2-066b-cbafe8000000 
Time:2017-05-12T22:01:16.1689598Z</Message><AuthenticationErrorDetail>The MAC signature found in the HTTP request 'N7UVKFwftf2YnAFdnciRneu7LsAkWHKXUpwhFRxlQqI=' is not the same as any computed signature. Server used following string to sign: 'PUT 


800 








x-ms-date:Fri, 12 May 2017 22:01:15 GMT 
x-ms-version:2016-05-31 
/<myaccount>/write/FixedRecord10r.txt 
comp:appendblock'.</AuthenticationErrorDetail></Error> 

しかし、私が署名を作成するメソッドでは、私はstringToSignを表示し、それは使用されているサーバとまったく同じです!ここで

PUT 


800 








x-ms-date:Fri, 12 May 2017 22:01:15 GMT 
x-ms-version:2016-05-31 
/<myaccount>/write/FixedRecord10r.txt 
comp:appendblock 

は、私はパラメータ化ヘッダーです:

public void AppendFile(MemoryStream stream) 
{ 
string dateFormatted = string.Format(CultureInfo.InvariantCulture, "{0:R}", DateTime.UtcNow); 
string signature = GetSignature("PUT", "xxxxxxx", afsAccount, dateFormatted, null, null, stream.Length, null); 

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://" + afsAccount + ".blob.core.windows.net" + path + "?comp=appendblock"); 
request.Headers.Add("x-ms-version", "2016-05-31"); 
request.Headers.Add("x-ms-date", dateFormatted); 
request.Headers.Add(HttpRequestHeader.Authorization, "SharedKey " + afsAccount + ":" + signature); 
request.Method = "PUT"; 
request.ContentLength = stream.Length; 

using (var requestStream = request.GetRequestStream()) 
{ 
     stream.Position = 0; 
     stream.CopyTo(requestStream); 
} 

try 
{ 
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()){ 
... 
} 


    private String GetSignature(string verb, string azureAccessKey, string afsAccount, string date, string byteRange, string containerName, long contentLength, string blobType) 
    { 
     if(byteRange != null) 
     { 
      byteRange = "x-ms-range:" + byteRange + "\n"; 
     } 

     string path = "/" + afsAccount + Dfs.Path; 
     if (containerName != null) 
     { 
      path = "/" + afsAccount + "/" + containerName + "\nrestype:container"; 
     }else if (contentLength > 0) 
     { 
      path += " \ncomp:appendblock"; 
     } 

     string length = "\n"; 
     if (contentLength != 0) 
     { 
      length = contentLength.ToString() + "\n"; 
     } 

     if (blobType != null) 
     { 
      blobType = "x-ms-blob-type:" + blobType + "\n"; 
     } 

     // construct input value 
     string inputValue = verb + "\n" + 
      "\n" + /*Content-Encoding*/ 
      "\n" + /*Content-Language*/ 
      length + /*Content-Length*/ 
      "\n" + /*Content-MD5*/ 
      "\n" + /*Content-Type*/ 
      "\n" + /*Date*/ 
      "\n" + /*If-Modified-Since*/ 
      "\n" + /*If-Match*/ 
      "\n" + /*If-None-Match*/ 
      "\n" + /*If-Unmodified-Since*/ 
      "\n" + /*Range*/ 
      blobType + 
      "x-ms-date:" + date + "\n" + 
      byteRange + 
      "x-ms-version:2016-05-31\n" + 
      path; 

     Console.WriteLine(inputValue); 

     // create base64 encoded signature 
     var hmac = new HMACSHA256(); 
     hmac.Key = Convert.FromBase64String(azureAccessKey); 
     byte[] sigbyte = hmac.ComputeHash(Encoding.UTF8.GetBytes(inputValue)); 
     var signature = Convert.ToBase64String(sigbyte); 

     return signature; 
    } 

私が何かを逃した場合は、この特定の操作に問題がある場合、私は他の問題を持っていたことがないように私が今思ったんだけどオペレーション。

+0

私はここに余分なスペースがあることに気付きました: '{ path + =" \ ncomp:appendblock "; } '(' ''と '\ n'の間に)あなたはそれを取り除き、あなたの要求を再度試みることができますか? –

+0

余分なスペースが問題でした...ありがとう! – Dragonsen

答えて

0

私は("\n間)ここに余分なスペースがあることに気づい:

{ 
    path += " \ncomp:appendblock"; 
} 

このスペースを削除して、もう一度リクエストを試してみてください。

関連する問題