Azure存储CORS返回原始通配符并在浏览器中失败



在Azure blob存储上启用CORS时,几乎所有内容都可以设置,但"…允许凭据"标头始终为true。

因此,当使用通配符作为原点标头时,飞行前请求工作正常,并将通配符转换为实际原点。

但随后的GET请求不会转换通配符,并返回以下组合:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

这在Chrome(可能还有其他浏览器(中是非法的。错误为

XMLHttpRequest cannot load ...
A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true.
Origin 'http://localhost' is therefore not allowed access. 

在新的WebAPI v2 CORS包中,通配符被替换为实际来源。此外,为什么我在向blob存储的请求中需要cookie等凭据?最好把它关掉。

当我想使用原始通配符时,我该如何解决这个问题?

更新

这是我在App_Start 上运行的初始化代码

public static void Initialize()
{
    // Azure blob storage settings
    var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["AzureStorage"].ConnectionString);
    var client = storageAccount.CreateCloudBlobClient();
    var serviceProperties = client.GetServiceProperties();
    serviceProperties.Cors = new CorsProperties();
    serviceProperties.Cors.CorsRules.Add(new CorsRule()
    {
        AllowedHeaders = new List<string>() { "*" },
        AllowedOrigins = new List<string>() { "*" },
        AllowedMethods = CorsHttpMethods.Get,
        ExposedHeaders = new List<string>() { "*" },
        MaxAgeInSeconds = 3600
    });
    client.SetServiceProperties(serviceProperties);
}

您遇到的错误是由于将xmlhttpreqeust上的withCredentials属性设置为true,在这种情况下,浏览器将拒绝通配符Access Control Allow Origin。

在新的WebAPI v2 CORS包中,通配符被替换为实际来源。

返回通配符是启用缓存的正确方法,请查看以下场景:

  • 用户A向MAS(Microsoft Azure存储(上的公共blob发送GET请求
  • 如果您使用CDN/Proxy缓存公共资源(这是一种最佳做法(,则CDN将缓存访问控制允许来源设置为"*"的blob
  • 现在,用户B向MAS发送相同的请求,并从缓存中获得响应,在这种情况下,由于缓存的blob具有通配符Access Control Allow Origin,浏览器将允许该请求,而不需要访问MAS服务器

现在,在您总是返回实际原点的另一种情况下,您不能为多个客户端缓存该资源,因为如果访问控制允许原点的实际原点与请求原点标头不同,浏览器将使CORS请求失败。

此外,为什么我需要在请求blob存储?最好把它关掉。

您可能需要凭据,因为发送经过身份验证的请求的一种方法是使用Authorization标头,如果飞行前请求不允许这样做,那么浏览器应该会使用Authorization报头使实际请求失败。

withCredentials == false

在CCD_ 2对象上。在我的例子中,这个设置在我使用的js框架中被搞砸了。

最新更新