【问题标题】:WithOrigins partially overrides Access-Control-Allow-Origin .NetCore APIWithOrigins 部分覆盖 Access-Control-Allow-Origin .Net Core API
【发布时间】:2017-08-12 06:11:10
【问题描述】:

在我的 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 标记应该是什么样子?

【问题讨论】:

  • 如果您将问题更新为还包含一个代码 sn-p,该代码显示您尝试发送的请求的客户端 JavaScript 代码,这将很有用。如果以块引用的形式逐字粘贴您在每种情况下在浏览器控制台中看到的确切错误消息,也会有所帮助。

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


【解决方案1】:

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

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

似乎在 web.config 中有一个 &lt;httpProtocol&gt; 标记会导致它在两个地方查找应该只出现一次的信息。

【讨论】:

    【解决方案2】:

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

    • 如果您只想允许https://acme.com,则可以从web.config 中删除&lt;add name="Access-Control-Allow-Origin" value="*"/&gt; 行,服务器仍将发送Access-Control-Allow-Origin: https://acme.com 响应标头。

    • 1234563 &lt;add name="Access-Control-Allow-Origin" value="*"/&gt; 来自您的 web.config,因为服务器已经发送了一个 Access-Control-Allow-Origin: * 以允许所有来源。

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

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

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

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

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

    如果您在此处使用.WithHeaders(…).AllowAnyHeader() 标头,则还可以从web.config 中删除&lt;add name="Access-Control-Allow-Headers" value="Origin..."/&gt;

    【讨论】:

    • 我在删除 &lt;add name="Access-Control-Allow-Origin" value="*"/&gt; 时尝试了所有这些组合,并且在 ajax 调用中收到预检请求错误,指出“对预检请求的响应未通过访问控制检查:否”访问-请求的资源上存在 Control-Allow-Origin' 标头。因此,不允许访问 Origin https://acme.com。"
    • 我想允许特定的来源。我绝对不想允许任何来源。
    • 您说在某些情况下您会收到一条控制台消息,说明 ACAO 标头具有多个值“https://acme.com”和“*”。所以这似乎意味着你的app.UseCors 电话正在工作,因为这是你指定https://acme.com 的唯一地方,对吧?所以删除&lt;add name="Access-Control-Allow-Origin" value="*"/&gt; 应该可以消除* 添加到ACAO 值的问题。但听起来它只是导致浏览器给你一个不同的错误?查看确切的错误消息会有所帮助,您的问题会解释导致每个错误情况的步骤
    猜你喜欢
    • 2021-01-07
    • 2013-01-20
    • 2019-02-01
    • 2017-06-15
    • 2016-09-30
    • 2015-06-17
    • 2019-03-21
    • 2017-12-29
    • 2018-11-10
    相关资源
    最近更新 更多