Как я могу установить CORS в Azure BLOB Storage на портале?

У нас есть хранилище blob на Windows Azure.

http://mytest.blob.core.windows.net/forms

Я загрузил несколько файлов в хранилище с помощью CloudBerry. И я могу загрузить файлы с помощью браузеров. Эти файлы представляют собой простые текстовые файлы, но с разными расширениями файлов. Например,

http://mytest.blob.core.windows.net/forms/f001.etx

Я хочу загрузить файлы через jquery ($.get), однако он не удалось из-за CORS.

Как я могу настроить CORS в Azure BLOB Storage на портале?

И, должен ли я сделать что-то для CORS на стороне клиента тоже?

Ответ 1

ОБНОВЛЕНИЕ:. Во время этого ответа у Azure Portal эта функция отсутствовала. Теперь это выглядит как . Ниже описывается способ сделать это до добавления пользовательского интерфейса.

Как я могу настроить CORS в Azure BLOB Storage на портале?

Если вы хотите, вы всегда можете программно программировать правила CORS для хранения памяти. Если вы используете библиотеку .Net Storage Client, ознакомьтесь с этой записью в блоге из группы хранения: http://blogs.msdn.com/b/windowsazurestorage/archive/2014/02/03/windows-azure-storage-introducing-cors.aspx. Код для настройки CORS из этого сообщения в блоге:

private static void InitializeCors()
{
     // CORS should be enabled once at service startup
     // Given a BlobClient, download the current Service Properties 
     ServiceProperties blobServiceProperties = BlobClient.GetServiceProperties();
     ServiceProperties tableServiceProperties = TableClient.GetServiceProperties();

     // Enable and Configure CORS
     ConfigureCors(blobServiceProperties);
     ConfigureCors(tableServiceProperties);

     // Commit the CORS changes into the Service Properties
     BlobClient.SetServiceProperties(blobServiceProperties);
     TableClient.SetServiceProperties(tableServiceProperties);
}

private static void ConfigureCors(ServiceProperties serviceProperties)
{
    serviceProperties.Cors = new CorsProperties();
    serviceProperties.Cors.CorsRules.Add(new CorsRule()
    {
        AllowedHeaders = new List<string>() { "*" },
        AllowedMethods = CorsHttpMethods.Put | CorsHttpMethods.Get | CorsHttpMethods.Head | CorsHttpMethods.Post,
        AllowedOrigins = new List<string>() { "*" },
        ExposedHeaders = new List<string>() { "*" },
        MaxAgeInSeconds = 1800 // 30 minutes
     });
}

Если вы ищете инструмент для этого, несколько исследователей хранилища поддерживают конфигурацию CORS - Azure Storage Explorer, Cerebrata Azure Management Studio, Cloud Portam (Disclosure - я создаю утилиту Cloud Portam).

Как только CORS настроен правильно, вы можете использовать код, упомянутый в ответе Рори, для загрузки файла из хранилища blob. Вам не нужно делать что-либо особенное на стороне клиента, как упоминалось Рори.

Ответ 2

Это можно сделать прямо сейчас на портале, к счастью. Если вы просто выберите учетную запись, вы увидите меню с различными параметрами, а CORS будет одним из них для каждой из служб Blob, File и т.д.

введите описание изображения здесь введите описание изображения здесь

Ответ 3

Теперь вы можете легко установить/отредактировать/просмотреть правила CORS с помощью силовой оболочки azure. Дополнительную информацию можно найти по этой ссылке:

https://azure.microsoft.com/en-us/documentation/articles/storage-powershell-guide-full/

Чтобы суммировать следующие команды оболочки питания, вы установите CORS для своего блоба:

  • Запустите Add-AzureAccount, чтобы войти в свою учетную запись
  • Смотрите ваши подписки в лазурном Get-AzureSubscription | Format-Table SubscriptionName, IsDefault, IsCurrent, CurrentStorageAccountName
  • Установить желаемую подписку $SubscriptionName = 'Your subscription name'
  • Проверьте желаемый blob Get-AzureStorageBlob
  • Теперь вам нужно создать контекст авторизации для вашего blob $ctx = New-AzureStorageContext и ввести нужные параметры.
  • Теперь вы готовы получить или установить правила CORS для своего блоба. Проверьте действующие правила CORS Get-AzureStorageCORSRule -ServiceType Blob -Context $ctx
  • Установить текущие правила CORS, например: $CorsRules = (@{ [email protected]("*"); [email protected]("*"); [email protected]("content-length"); MaxAgeInSeconds=200; [email protected]("Get","Connect", "Head")})
  • Set-AzureStorageCORSRule -ServiceType Blob -CorsRules $CorsRules -Context $ctx

Ответ 4

Более тонкий способ установки CORS через PowerShell: https://gist.github.com/irwinwilliams/4cf93b6e2461c753ff125590650186ae

#works with Azure in Powershell v 1.3.2
clear 
$StorageAccountName = "[storageaccountname]"
$Key = "[storageaccountkey]"
$Context = New-AzureStorageContext -StorageAccountKey $Key -StorageAccountName $StorageAccountName
$CorsRules = (@{
    [email protected]("*");
    [email protected]("*");
    [email protected]("content-length");
    MaxAgeInSeconds=200;
    [email protected]("Get","Connect", "Head")})
Set-AzureStorageCORSRule -ServiceType Blob -CorsRules $CorsRules -Context $Context
$CORSrule = Get-AzureStorageCORSRule -ServiceType Blob -Context $Context
echo "Current CORS rules: "
echo $CORSrule

Ответ 5

Чтобы убедиться, что ваша настройка B2C работает, вам нужно позаботиться о вещах ниже:

  • Убедитесь, что ваш контент совместим с HTML5 и доступен
  • Убедитесь, что ваш сервер содержимого включен для CORS. Ссылка: Как установить CORS в Azure BLOB Storage на портале?
  • (Очень важно) Подавать контент через HTTPS.
  • (необязательно) Используйте абсолютные URL-адреса, такие как https://yourdomain/content для всех ссылок и содержимого CSS.

Совет. Чтобы убедиться, что сайт, на котором размещен ваш контент, включен CORS и проверяет запросы CORS, вы можете использовать сайт http://test-cors.org/. Благодаря этому сайту вы можете просто отправить запрос CORS на удаленный сервер (проверить, поддерживает ли CORS), или отправить запрос CORS на тестовый сервер (для изучения некоторых функций CORS).

Ссылка: https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-reference-customize-ui-custom

Ответ 6

Хранилище Azure Blob поддерживает CORS, но вам нужно установить заголовки перед выполнением запроса. Для этого было бы лучше использовать $.ajax, поскольку он дает вам больше контроля над отправляемой информацией. Здесь приведен новый пример этой демонстрации:

function setHeader(xhr) {
    xhr.setRequestHeader('x-ms-version', '2013-08-15');
    xhr.setRequestHeader('MaxDataServiceVersion', '3.0');
    xhr.setRequestHeader('Accept', 'application/json;odata=nometadata');
}

$.ajax({
    type: 'GET',
    datatype: "json",
    url: 'http://mytest.blob.core.windows.net/forms/f001.etx',
    beforeSend: setHeader,
    success: function(data) {
        // do something with the retrieved file.
    },
    error: function (res, status, xhr) {
        alert("can't get the data for the specified table");
    }
});

Ответ 7

Вот как я включил cors с консольным приложением, просто укажите свои учетные данные внутри StorageCredentials:

private static CloudStorageAccount StorageAccount;

    public static CloudBlobClient BlobClient
    {
        get;
        private set;
    }

    static void Main(string[] args)
    {

        StorageAccount = new CloudStorageAccount(new StorageCredentials("AccountName", "AccountKey"), true);
        BlobClient = StorageAccount.CreateCloudBlobClient();

        InitializeCors(BlobClient);
    }

    private static void InitializeCors(CloudBlobClient blobClient)
    {           
        ServiceProperties blobServiceProperties = BlobClient.GetServiceProperties();

        ConfigureCors(blobServiceProperties);

        BlobClient.SetServiceProperties(blobServiceProperties);         
    }

    private static void ConfigureCors(ServiceProperties serviceProperties)
    {
        serviceProperties.Cors = new CorsProperties();
        serviceProperties.Cors.CorsRules.Add(new CorsRule()
        {
            AllowedHeaders = new List<string>() { "*" },
            AllowedMethods = CorsHttpMethods.Put | CorsHttpMethods.Get | CorsHttpMethods.Head | CorsHttpMethods.Post,
            AllowedOrigins = new List<string>() { "*" },
            ExposedHeaders = new List<string>() { "*" },
            MaxAgeInSeconds = 1800 // 30 minutes
        });
    }