WithOrigins部分覆盖Access-Control-Allow-Origin .NetCore API

时间:2017-03-20 19:38:18

标签: asp.net-core cors .net-core asp.net-core-webapi

在我的Startup.cs中我有

app.UseCors(builder => builder.WithOrigins("https://acme.com"));

在我的web.config中我有

<configuration>
 <system.webServer>
  <httpProtocol>
   <customHeaders>
    <add name="Accept-Encoding" value="gzip, deflate, sdch" />
    <add name="Access-Control-Allow-Origin" value="*"/>        
    <add name="Access-Control-Allow-Headers" value="Origin..." />

当我提交这样的ajax请求时,它告诉我,ACAO只允许一个值,我有多个&#34; https://acme.com,*&#34;。

当我完全删除值部分时,同样的错误,但它不是列出我的原点,而是开始列出Allow-Access-Control-Headers标记中的值。

当我完全删除ACAO标签时,可以理解的是告诉我没有标签。

如果我的配置中有WithOrigins规范,那么ACAO标记应该是什么样的?

2 个答案:

答案 0 :(得分:1)

问题不清楚你真正想要允许的起源。看来您的选择是:

  • 如果您只想https://acme.com,那么您可以从<add name="Access-Control-Allow-Origin" value="*"/>中删除web.config行,服务器仍会发送Access-Control-Allow-Origin: https://acme.com个响应标题

  • 如果您想允许所有来源,app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll)就是您想要使用的 - 而且这种情况也是如此 来自<add name="Access-Control-Allow-Origin" value="*"/>的{​​{1}},因为服务器已经发送web.config以允许所有来源。

您还可以在Access-Control-Allow-Origin: *来电中指定允许的标头,如下所示:

app.UseCors

请注意,您不需要在那里指定app.UseCors(builder => builder.WithOrigins("https://acme.com") .WithHeaders("Authorization", "Location")); 标头,因为浏览器不需要OriginOrigin中才能允许它。 (因为Access-Control-Allow-Headers标头是由浏览器本身在请求中设置和发送的;它不是“自定义”标头。)

如果您只想允许所有请求标头,则可以执行以下操作:

Origin

如果您使用app.UseCors(builder => builder.WithOrigins("https://acme.com") .AllowAnyHeader()); .WithHeaders(…)标题,则可以从.AllowAnyHeader()

中删除<add name="Access-Control-Allow-Headers" value="Origin..."/>

答案 1 :(得分:1)

这实际上是别人的项目,所以我不确定web.config条目从何处开始。我完全删除了网络配置的<httpprotocol>部分,并使用以下正常流程让AddCors()工作:

app.UseCors(builder =>
        {
            builder.WithOrigins("http://acme.com");
        });

好像在web.config中有一个<httpProtocol>标记会导致它在两个地方查找只应该出现一次的信息。