2016-09-21 4 views
0

Я пытаюсь очистить все сообщения очереди очереди Azure через API REST API очереди. Я проверил, что код верен, но он все же возвращает 403 запрещенную ошибку. «StorageSharedKey» и «StorageAccountName» верны, так как я могу подключиться к очереди azure, используя эти значения в строке соединения для клиента очереди azure. Используемая версия хранилища - «2015-12-11».Azure Storage Service бросает 403 запрещенную ошибку при попытке вызвать REST API для очистки сообщений очереди

Вот код:

internal void ClearStorageQueueMessages(string queueName) 
    { 
     const string requestMethod = "DELETE"; 
     string urlPath = $"{queueName}/messages"; 
     var dateInRfc1123Format = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture); 
     var canonicalizedHeaders = $"x-ms-date:{dateInRfc1123Format}\nx-ms-version:{StorageVersion}"; 
     var canonicalizedResource = $"/{StorageAccountName}/{urlPath}"; 
     var uri = new Uri($"https://{StorageAccountName}.queue.core.windows.net/{urlPath}"); 
     var response = MakeDeleteRestCall(uri, requestMethod, dateInRfc1123Format, canonicalizedHeaders, canonicalizedResource); 
    } 

    internal RestResponse MakeDeleteRestCall(Uri uri, string requestMethod, string dateInRfc1123Format, string canonicalizedHeaders, 
     string canonicalizedResource) 
    { 
     var restResponse = new RestResponse(); 
     var stringToSign = $"{requestMethod}\n\n\n\n\n\n\n\n\n\n\n\n{canonicalizedHeaders}\n{canonicalizedResource}"; 
     var authorizationHeader = CreateAuthorizationHeader(stringToSign); 

     var request = (HttpWebRequest) WebRequest.Create(uri); 
     request.Method = requestMethod; 
     request.Headers.Add("x-ms-date", dateInRfc1123Format); 
     request.Headers.Add("x-ms-version", StorageVersion); 
     request.Headers.Add("Authorization", authorizationHeader); 
     //request.Accept = "application/atom+xml,application/xml"; 
     request.Accept = "application/json"; 
     //request.ContentType = "application/json"; 

     using (var response = (HttpWebResponse) request.GetResponse()) 
     { 
      restResponse.StatusCode = response.StatusCode; 
      var responseStream = response.GetResponseStream(); 
      if (responseStream == null) 
       return restResponse; 
      using (var reader = new StreamReader(responseStream)) 
      { 
       restResponse.ReturnedContent = reader.ReadToEnd(); 
      } 
     } 
     return restResponse; 
    } 

    internal static string CreateAuthorizationHeader(string canonicalizedString) 
    { 
     string signature; 

     using (var hmacSha256 = new HMACSHA256(Convert.FromBase64String(StorageSharedKey))) 
     { 
      var dataToHmac = Encoding.UTF8.GetBytes(canonicalizedString); 
      signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac)); 
     } 

     var authorizationHeader = string.Format(CultureInfo.InvariantCulture, "{0} {1}:{2}", StorageSharedKey, 
      StorageAccountName, signature); 

     return authorizationHeader; 
    } 
+0

Я запускаю это из своего местного компьютера, кстати. Будет ли это иметь значение? – TheDude

+0

На самом деле, похоже, что у меня такая же проблема со значением 403, когда я пытаюсь подключиться к эмулятору. – TheDude

ответ

1

Проблема, кажется, с Authorization заголовка. Пожалуйста, проверьте формат в соответствии с документацией:

Авторизация = "[SharedKey | SharedKeyLite]:"

https://msdn.microsoft.com/en-us/library/azure/dd179428.aspx

Ваша функция добавляет общий ключ в виде простого текста вместо схемы авторизации «SharedKey» или «SharedKeyLite».

+0

Как еще должна строиться схема авторизации? Согласно документации, авторизация должна быть построена в этом формате: {0} {1}: {2}, при этом общий ключ хранилища вместо 0, имя учетной записи хранилища вместо 1 и подпись вместо 2. И затем эта строка назначается заголовку «Authroization» в запросе. Все примеры, которые я видел, делают так. – TheDude

+0

На самом деле, похоже, вы были на что-то! Мне нужно было использовать слово «SharedKey» вместо фактического значения общего ключа. Спасибо миллион! – TheDude

 Смежные вопросы

  • Нет связанных вопросов^_^