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

WithOrigins partially overrides Access-Control-Allow-Origin .NetCore API

在我的 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 只允许一个值,我有多个“https://acme.com, *”。

当我完全删除值部分时,同样的错误,但它没有列出我的来源,而是开始列出 Allow-Access-Control-Headers 标签中的值。

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

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

问题并不清楚您实际想要允许哪些来源。您的选择似乎是:

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

  • 如果你想允许所有来源,app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll) 是你想要使用的 - 在这种情况下你也想只删除带有 <add name="Access-Control-Allow-Origin" value="*"/> 来自您的 web.config,因为服务器已经发送 Access-Control-Allow-Origin: * 以允许所有来源。


您还可以在 app.UseCors 调用中指定允许的 header,如下所示:

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

请注意,您不需要在此处指定 Origin header,因为浏览器不需要 OriginAccess-Control-Allow-Headers 中以便它被允许。 (因为 Origin header 是由浏览器本身在请求中设置和发送的;它不是“自定义” header。)

如果您只想允许所有请求 header,您可以改为这样做:

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

如果您在那里使用 .WithHeaders(…).AllowAnyHeader() header,您还可以从 web.config[=29= 删除 <add name="Access-Control-Allow-Headers" value="Origin..."/> 行]

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

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

似乎在 web.config 中有一个 <httpProtocol> 标签导致它在两个地方查找本应只出现一次的信息。