Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure存储CORS返回源通配符,并在浏览器中失败_Azure_Cors_Azure Storage - Fatal编程技术网

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

Azure存储CORS返回源通配符,并在浏览器中失败,azure,cors,azure-storage,Azure,Cors,Azure Storage,在Azure blob存储上启用CORS时,几乎可以设置所有内容,但“…允许凭据”标题始终为真 因此,当使用通配符作为原点标头时,飞行前请求工作正常,并将通配符转换为实际原点 但随后的GET请求不会转换通配符并返回以下组合: Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true 这在Chrome(可能还有其他浏览器)中是非法的。错误是 XMLHttpRequest cannot load ... A wild

在Azure blob存储上启用CORS时,几乎可以设置所有内容,但“…允许凭据”标题始终为真

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

但随后的
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存储的请求中需要cookies之类的凭据?最好把它关掉

当我想使用原点通配符时,如何修复该问题

更新

下面是我在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);
}
publicstaticvoidinitialize()
{
//Azure blob存储设置
var storageAccount=CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings[“AzureStorage”].ConnectionString);
var client=storageAccount.CreateCloudBlobClient();
var serviceProperties=client.GetServiceProperties();
serviceProperties.Cors=新的CorsProperties();
serviceProperties.Cors.CorsRules.Add(新的CorsRule()
{
AllowedHeaders=new List(){“*”},
AllowedOrigins=新列表(){“*”},
AllowedMethods=CorsHttpMethods.Get,
ExposedHeaders=new List(){“*”},
MaxAgeInSeconds=3600
});
client.SetServiceProperties(serviceProperties);
}

withCredentials == false

XmlHttpRequest
对象上。在我的例子中,这个设置在我使用的js框架中被弄乱了。

withCredentials == false

XmlHttpRequest
对象上。在我的例子中,此设置在我使用的js框架中出错。

您遇到的错误是由于将XMLHttpRequest上的withCredentials属性设置为true,在这种情况下,浏览器将拒绝通配符访问控制允许源

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

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

  • 用户A向MAS(Microsoft Azure存储)上的公共blob发送GET请求
  • 如果您使用CDN/代理缓存公共资源(这是一种最佳做法),则CDN将缓存blob,并将访问控制允许源设置为“*”
  • 现在,用户B向MAS发送相同的请求,并从缓存中获取响应,在这种情况下,由于缓存的blob具有通配符访问控制允许源,浏览器将允许该请求,而您不需要点击MAS服务器
现在,在另一种情况下,您总是返回实际来源,您不能为多个客户端缓存该资源,因为如果访问控制允许来源具有与请求来源标头不同的实际来源,浏览器将使CORS请求失败

还有,为什么我需要证书,比如在 请求blob存储?最好把它关掉


您需要凭据,因为发送经过身份验证的请求的一种方法是使用授权标头,如果飞行前请求不允许使用授权标头,则浏览器应使用授权标头使实际请求失败。

您遇到的错误是由于将XMLHttpRequest上的withCredentials属性设置为true,在这种情况下,浏览器将拒绝通配符访问控制允许原点

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

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

  • 用户A向MAS(Microsoft Azure存储)上的公共blob发送GET请求
  • 如果您使用CDN/代理缓存公共资源(这是一种最佳做法),则CDN将缓存blob,并将访问控制允许源设置为“*”
  • 现在,用户B向MAS发送相同的请求,并从缓存中获取响应,在这种情况下,由于缓存的blob具有通配符访问控制允许源,浏览器将允许该请求,而您不需要点击MAS服务器
现在,在另一种情况下,您总是返回实际来源,您不能为多个客户端缓存该资源,因为如果访问控制允许来源具有与请求来源标头不同的实际来源,浏览器将使CORS请求失败

还有,为什么我需要证书,比如在 请求blob存储?最好把它关掉


您需要凭据,因为发送经过身份验证的请求的一种方法是使用授权标头,如果飞行前请求不允许使用授权标头,则浏览器应使用授权标头使实际请求失败。

您可以分享为Blob服务上的CORS设置的规则吗?另外,为了进一步调查,您是否可以私下与“waelabd at microsoft.com”共享选项和实际请求的Fiddler跟踪?谢谢!刚刚发送了跟踪。您能分享一下您为Blob服务上的CORS设置的规则吗?另外,为了进一步调查,您是否可以私下与“waelabd at microsoft.com”共享选项和实际请求的Fiddler跟踪?谢谢!刚刚发送了跟踪,太好了!微软最初的博文没有那么深奥,太棒了!微软最初的博文没有那么深奥。