получение 403 запрещенных веб-исключений для запроса на поставку лазурного блоба - PullRequest
1 голос
/ 06 января 2011

Я использую этот код для загрузки некоторого текста прямо в BLOB-объект Azure, используя остальные API.Я получаю исключение 403 запрещено.Может кто-то, пожалуйста, скажет мне, где я ошибаюсь в моем коде

    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"];
            }
      //  }
    }

1 Ответ

0 голосов
/ 06 марта 2011

Сначала вы создаете объект HMACSHA256, используя конструктор по умолчанию - это вызывает генерирование случайного ключа и его использование для подписи.Вам нужна перегрузка, которая принимает строку и передает ключ учетной записи Azure.

Тем не менее, подписание запроса «вручную» может быть сложным, так как есть много вещей, которые нужно сделать, и их легко испортитьили что-то забыть.Вместо этого я рекомендую вам использовать метод SignRequest класса StorageCredentialsAccountAndKey ( msdn doc ). Например;

// ...there exists a request object, and strings for the account name and key</p> <p>var creds = new StorageCredentialsAccountAndKey(accountName, accountKey);<br/> creds.SignRequest(request);

. Это сделает все необходимоеправильно подписать запрос, включая создание канонизированной строки заголовков, создание даты в правильном формате и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...