Azure 存储 CORS

Azure Storage CORS

我在 www.somedomain.com 上有一个应用程序。现在,我所有的文件(最终用户上传的)都存储在 Azure 存储中,该存储的域类似于 somesubdomain.blob.core.windows.net。每当用户要查看文档时,将Azure上文档的public link添加到iframe源中,即可查看。唯一的问题是,在许多情况下,该文件是包含 Javascript 的 html,它试图访问最初位于我的第一台主机上的父级上的一些基本安全无关变量。

每次 Azure 存储上的 html 文件尝试访问父文档变量时,我都会收到错误 "Blocked a frame with origin 'http://somesubdomain.blob.core.windows.net' from accessing a frame with origin "http://somedomain.com"。协议、域和端口必须匹配。'

有关这方面的任何指导和帮助都会有所帮助。

您需要在存储帐户的 blob 服务上启用 CORS 才能跨域 JavaScript 访问。您可以在此处了解有关 Azure 存储和 CORS 的更多信息:https://msdn.microsoft.com/en-us/library/azure/dn535601.aspx.

前段时间我也写了一篇博客post,你可以在这里阅读:http://gauravmantri.com/2013/12/01/windows-azure-storage-and-cors-lets-have-some-fun/

如果您使用的是 .Net Storage Client 库,则可以使用以下代码设置 CORS 规则:

static void AddCorsRuleStorageClientLibrary()
{
    //Add a new rule.
    var corsRule = new CorsRule()
    {
        AllowedHeaders = new List<string> { "*" },
        AllowedMethods = CorsHttpMethods.Get
        AllowedOrigins = new List<string> { "http://somedomain.com" },//This is the URL of your application.
        MaxAgeInSeconds = 1 * 60 * 60,//Let the browser cache it for an hour
    };

    //First get the service properties from storage to ensure we're not adding the same CORS rule again.
    var storageAccount = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
    var client = storageAccount.CreateCloudBlobClient();
    var serviceProperties = client.GetServiceProperties();
    var corsSettings = serviceProperties.Cors;

    corsSettings.CorsRules.Add(corsRule);
    //Save the rule
    client.SetServiceProperties(serviceProperties);
}

另一种解决方法是为自己创建一个指向您的存储文件的自定义域 - 类似于 filestore.somedomain.com.

在 Azure 存储帐户上启用 CORS 的最简单方法是使用 azure-cli

npm i azure-cli -g

那么,就可以通过命令行配置CORS了:

azure storage cors set
  -a "storage-account"
  -k "storage-account-key"
  --blob/table/queue/file
  --cors "[{\"AllowedOrigins\":\"*\",\"AllowedMethods\":\"GET\",\"MaxAgeInSeconds\":\"86400\",\"AllowedHeaders\":\"*\",\"ExposedHeaders\":\"*\"}]"

这里的答案与 Pier-Luc Gendreau 的答案相似,但与新的 azure-cli v2.0 相关。

az storage cors add --account-name $ACCNT_NAME --account-key $ACCNT_KEY \
    --methods GET --origins '*' --services t --allowed-headers '*'

请注意,v2.0 基于 python 而不是基于 Node.js 的 v1.0

官方安装说明可用 here,但对我来说,以下似乎是保持系统清洁的更好选择:

virtualenv --system-site-packages -p python3 ~/azure-cli/
source ~/azure-cli/bin/activate
pip3 install azure-cli

以下是与您可能希望根据具体情况更改的必需参数相关的帮助消息的摘录。

--methods  [Required]: List of HTTP methods allowed to be executed by the origin.  Allowed
                       values: DELETE, GET, HEAD, MERGE, OPTIONS, POST, PUT.
--origins  [Required]: List of origin domains that will be allowed via CORS, or "*" to allow all
                       domains.
--services [Required]: The storage service(s) to add rules to. Allowed options are: (b)lob,
                       (f)ile, (q)ueue, (t)able. Can be combined.