Общий доступ для авторизации изображений Azure Blob - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь прочитать изображение, используя заголовок авторизации, но, похоже, произошла ошибка в создаваемой строке авторизованного заголовка.Я получаю следующую ошибку.

 <?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:a5e98b3e-c01e-002e-19ad-be5c0e000000
    Time:2019-02-07T06:22:40.0625641Z</Message>
        <AuthenticationErrorDetail>The MAC signature found in the HTTP request 'm+68ihJL2+Wl0Cm1vuXOHnzq4ma56utn/62hSCv6rjo=' is not the same as any computed signature. Server used following string to sign: 'GET




    image/jpeg






    x-ms-blob-type:Block blob
    x-ms-date:Thu, 07 Feb 2019 06:21:44 GMT
    x-ms-version:2018-03-28
    /<accountName>/<container>/<image.jpg>'.</AuthenticationErrorDetail>
    </Error> 

Это код, который я использовал для генерации заголовка.

namespace ShaKey
{
    class Program
    {
        static void Main(string[] args)
        {

            string stringToSign = "GET\n\n\n\n\nimage/jpeg\n\n\n\n\n\n\nx- 
                                   ms-date:" + DateTime.UtcNow.ToString("R", 
                                   CultureInfo.InvariantCulture) + "\nx-ms- 
                                    version:2018-03-28\n/<accountName>/<container>/<image.jpg>";

            Console.WriteLine(SharedKey.CreateAuthorizationHeader(stringToSign));
            string date = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);
            Console.WriteLine(date);

        }

    }

    public class SharedKey
    {


        public static String CreateAuthorizationHeader(String canonicalizedString)
        {
            String signature = String.Empty;
            string storageAccountKey = "accountKey"

            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;
        }

    }

    public class AzureStorageConstants
    {
        public static string SharedKeyAuthorizationScheme = "SharedKey";
        public static string Account ="accountname";
    }
}

Произошла ошибка в генерируемом заголовке.Где ошибка в коде ошибки?

Ответы [ 2 ]

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

Аутентификация не удалась, потому что вы добавили заголовок x-ms-blob-type (показанный в ошибке), но не поместили его в stringToSign.

На самом деле, Получить BLOB-объект не требуетсяx-ms-blob-type ни Content-Type в заголовке запроса, они используются в Put Blob .Поэтому решение состоит в том, чтобы удалить два заголовка x-ms-blob-type и Content-Type и удалить image/jpeg в stringToSign.

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

Глядя на документацию , вы можете сгенерировать токен SAS для такого большого двоичного объекта:

(сначала необходимо установить этот пакет nuget: WindowsAzure.Storage )

using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage;
...
var connectionString = "DefaultEndpointsProtocol=https;AccountName=<account-name>;AccountKey=<account-key>";
var storageAccount = CloudStorageAccount.Parse(connectionString);

var container = storageAccount.CreateCloudBlobClient().GetContainerReference("<container-name>");
var blob = container.GetBlobReference("<blob-name>");

var sasBlobToken = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy {
    Permissions = SharedAccessBlobPermissions.Read,
    SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-15),
    SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(60)
});
...