Доступ к ресурсу BLOB-объектов с использованием авторизации с общим ключом - PullRequest
0 голосов
/ 06 февраля 2019

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

<?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:48328e8c-601e-000a-3508-bec540000000
Time:2019-02-06T10:43:06.4920228Z</Message>
    <AuthenticationErrorDetail>The MAC signature found in the HTTP request 'jn37EV4KPWj3wQANreUQy8ih+H5rFOp0fqj1DebgBMk=' is not the same as any computed signature. Server used following string to sign: 'GET




image/jpeg






x-ms-date:Wed, 06 Feb 2019 10:38:54 GMT
x-ms-version:2018-03-28
/<accountName>/<containerFolder>/<image.jpg>'.</AuthenticationErrorDetail>
</Error>

Код, который я использовал для расчета подписи:

class Program
    {
        private static string storageAccountKey = "<account_key>";

        static void Main(string[] args)
        {
            string utcDate = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);
            string authStr = "GET\n\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:" + utcDate + "\nx-ms-version:2018-03-28\n/<account_name>/<container_name>/<image.jpeg>";
            string hash = CreateAuthorizationHeader(authStr);
            Console.WriteLine(hash);
            Console.ReadKey(true);
        }

        public static String CreateAuthorizationHeader(String canonicalizedString)
        {
            String signature = String.Empty;

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

            String authorizationHeader = String.Format(
                CultureInfo.InvariantCulture,
                "{0} {1}:{2}",
                AzureStorageConstants.SharedKeyAuthorizationScheme,
                AzureStorageConstants.Account,
                signature
            );

            return authorizationHeader;
        }
    }

    class AzureStorageConstants
    {
        public static string SharedKeyAuthorizationScheme = "SharedKey";

        public static string Account = "<account_name>";
    }

Передаваемые мной заголовки:

  1. Тип содержимого: image / jpeg
  2. Авторизация: SharedKey account_name:jn37EV4KPWj3wQANreUQy8ih + H5rFOp0fqj1DebgBMk =
  3. x-ms-версия: 2018-03-28
  4. x-ms-date: ср, 06 фев. 2019 10:38:54 GMT

У меня есть точка останова в CreateAuthorizationHeader (String canonicalizedString) , и я копирую значения utcDate и Signature и передаю ее в заголовок.Где я иду не так .?

1 Ответ

0 голосов
/ 06 февраля 2019

Причина, по которой вы получаете эту ошибку, заключается в том, что вы передаете content-type в качестве одного из заголовков запроса, однако вы не включаете его при вычислении canonicalizedString.

ТамВы можете сделать две вещи:

  1. Удалить content-type из заголовков вашего запроса: поскольку вы получаете содержимое большого двоичного объекта, этот заголовок вам на самом деле не нужен.Как только вы удалите это, код будет работать нормально.
  2. Включите значение content-type header (image/jpeg) в ваши вычисления canonicalizedString: ваш код будет:

string authStr = "GET\n\n\n\n\n\n\n\n\n\n\n\nimage/jpeg\nx-ms-date:" + utcDate + "\nx-ms-version:2018-03-28\n/<account_name>/<container_name>/<image.jpeg>";

...