2011-01-06 8 views
1

私はこのコードを使用して、残りのapiを使用して空白のBLOBに直接テキストをアップロードしています。私は禁止されたwebexception 403を取得しています。私のコードで私は間違った場所をつもりだ教えてplaese誰か空白のBLOB put要求に対して403の禁止WebExceptionを取得

private String CreateAuthorizationHeader(String canonicalizedString, CloudBlob blob) 
    { 
     String signature = string.Empty; 


     using (HMACSHA256 hmacSha256 = new HMACSHA256()) 
     { 
      Byte[] dataToHmac = System.Text.Encoding.UTF8.GetBytes(canonicalizedString); 
      signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac)); 
     } 


     String authorizationHeader = String.Format(CultureInfo.InvariantCulture, "{0} {1}:{2}", "SharedKeyLite", myaccount, signature); 

     return authorizationHeader; 
    } 

    private void PutBlob(String containerName, String blobName , CloudBlob blob) 
    { 
     String requestMethod = "PUT"; 

     String urlPath = String.Format("{0}", blobName); 

     String storageServiceVersion = "2009-10-01"; 

     String dateInRfc1123Format = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture); 

     // if (uploadPST.HasFile) 
     // { 
      string content = "Sample file"; 
      // Stream content = uploadPST.FileBytes; 
      UTF8Encoding utf8Encoding = new UTF8Encoding(); 
      Byte[] blobContent = utf8Encoding.GetBytes(content); 
      Int32 blobLength = blobContent.Length; 


      const String blobType = "BlockBlob"; 

      /* String canonicalizedHeaders = String.Format(
        "x-ms-blob-type:{0}\nx-ms-date:{1}\nx-ms-version:{2}", 
        blobType, 
        dateInRfc1123Format, 
        storageServiceVersion);*/ 

      String canonicalizedHeaders = String.Format(
        "x-ms-date:{0}\nx-ms-meta-m1:{1}\nx-ms-meta-m1:{2}", 
        dateInRfc1123Format, 
        "v1", 
        "v2"); 

      String canonicalizedResource = String.Format("/{0}/{1}", myaccount, urlPath); 

      String stringToSign = String.Format(
        "{0}\n\n{1}\n\n{2}\n{3}", 
        requestMethod, 
        "text/plain; charset=UTF-8", 
        canonicalizedHeaders, 
        canonicalizedResource); 



      String authorizationHeader = CreateAuthorizationHeader(stringToSign, blob); 

      Uri uri = new Uri(CloudStorageAccount.FromConfigurationSetting("DataConnectionString").BlobEndpoint + "/" + urlPath); 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
      request.Method = requestMethod; 


      // request.Headers.Add("x-ms-blob-type", blobType); 
      request.Headers.Add("x-ms-date", dateInRfc1123Format); 
      // request.Headers.Add("x-ms-version", storageServiceVersion); 
      request.Headers.Add("Authorization", authorizationHeader); 
      request.ContentLength = blobLength; 

      using (Stream requestStream = request.GetRequestStream()) 
      { 
       requestStream.Write(blobContent ,0 ,blobLength); 
      } 

      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
      { 
       String ETag = response.Headers["ETag"]; 
      } 
     // } 
    } 
+0

など、正しい形式で日付を作成し、正規化ヘッダの文字列を作成するなど適切要求に署名するために必要なすべてのものを、行います、これは、上で議論されていますMSDNのWindows Azureフォーラム:http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/0526ccc4-63e3-404f-a355-28179b6e88cb – smarx

答えて

0

まず、あなたはデフォルトコンストラクタを使用してHMACSHA256オブジェクトを構築することができます - これは、署名のために生成して使用するランダムキーが発生します。あなたが望むのは、文字列を受け取り、空白のアカウントキーを渡すオーバーロードです。

依然として「手動で」リクエストに署名するのは難しいことかもしれません。たくさんのことがあり、何かを混乱させたり忘れたりするのは簡単です。代わりにSignRequestメソッドのStorageCredentialsAccountAndKeyクラス(msdn doc)を使用することをお勧めします。

// ...there exists a request object, and strings for the account name and key

var creds = new StorageCredentialsAccountAndKey(accountName, accountKey);
creds.SignRequest(request);

これは、他人のためにFYI

関連する問題