题 'Access-Control-Allow-Origin'标头包含多个值


我在客户端使用AngularJS $ http来访问服务器端ASP.NET Web API应用程序的端点。由于客户端作为服务器托管在不同的域上,因此我需要CORS。它适用于$ http.post(url,data)。但是只要我通过$ http.get(url)对用户进行身份验证并发出请求,我就会收到消息

'Access-Control-Allow-Origin'标题包含多个值'http://127.0.0.1:9000,http://127.0.0.1:9000',但只允许一个。因此,不允许来源“http://127.0.0.1:9000”访问。

Fiddler告诉我,在成功的选项请求之后,get请求中确实有两个头条目。我做错什么地方在哪里?

更新

当我使用jQuery $ .get而不是$ http.get时,会出现相同的错误消息。所以AngularJS似乎没有问题。但哪里错了?


78
2018-03-12 06:13


起源




答案:


我补充道

config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "“,”"))

以及

app.UseCors(CorsOptions.AllowAll);

在服务器上。这导致两个标题条目。只需使用后者即可。


44
2018-03-12 07:34



您似乎正在从设置文件中读取Properties.Settings.Default.Cors。你能发一个例子吗? UseCors属于哪个类? - Hoppe
“未捕获的ReferenceError:未定义EnableCorsAttribute”? - circuitry
@Hoppe,请看看 msdn.microsoft.com/en-us/library/dn314597(v=vs.118).aspx。它解释说,EnableCorsAttribute的第一个参数是允许的起源。例如“*”允许所有。 - Papa Mufflon
@Hoppe,UseCors是NuGet包中定义的扩展方法Microsoft.Owin.Cors。顺丰速 katanaproject.codeplex.com/SourceControl/latest#src/...。 - Papa Mufflon
config.EnableCors(enableCorsAttribute) 通常在WebApiConfig.cs中调用它 - 它是Microsoft.AspNet.WebApi.Cors Nuget包的一部分,其用法如下所述: asp.net/web-api/overview/security/...  app.UseCors(CorsOptions.AllowAll) 通常在Startup.Auth.cs中调用,作为配置身份提供程序(例如OAuth)的一部分,并且是Microsoft.Owin.Cors Nuget包的一部分。 - Henry C


我们遇到了这个问题,因为我们根据最佳实践建立了CORS(例如 http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api)还有一个自定义标题 <add name="Access-Control-Allow-Origin" value="*"/> 在web.config中。

删除web.config条目,一切都很好。

与@ mww的答案相反,我们仍然有 EnableCors() 在WebApiConfig.cs和 EnableCorsAttribute 在控制器上。当我们拿出一个或另一个时,我们遇到了其他问题。


37
2018-01-12 22:16



我删除了这行<add name =“Access-Control-Allow-Origin”value =“*”/>我在web.config文件中有以下其他两个条目,我没有删除:<add name =“Access -Control-Allow-Headers“value =”Content-Type“/> <add name =”Access-Control-Allow-Methods“value =”GET,POST,PUT,DELETE,OPTIONS“/> - Siva Karthikeyan
这是我的问题..谢谢 - lawphotog
这是关键,你必须只启用CORS一次,我的问题是我也在我的web.config以及app.UseCors()中启用了它...我删除了web.config条目并且只使用了app.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll);方法而不是。 - Mohammad Sepahvand
上面的一行救了我的命!确保你不会多次启用CORS,否则会发生这种情况,你会变得非常沮丧。 - TGarrett
“这是关键,你必须只启用CORS一次”< - 这是@MohammadSepahvand感谢。回到.NET并且已经感到惊讶:D。 - Tuan Jinn


我正在使用Cors 5.1.0.0,经过一番头痛之后,我发现这个问题是重复的 来自服务器的Access-Control-Allow-Origin和Access-Control-Allow-Header标头

删除 config.EnableCors() 从WebApiConfig.cs文件中,只需设置 [EnableCors("*","*","*")] Controller类的属性

检查 本文 了解更多细节。


31
2018-05-24 02:24





我既有OWIN也有我的WebAPI,两者显然都需要单独启用CORS,这反过来又创建了 'Access-Control-Allow-Origin' header contains multiple values 错误。

我最终删除了启用CORS的所有代码,然后将以下内容添加到 system.webServer 我的Web节点.Config:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" />
  </customHeaders>
</httpProtocol>

为OWIN(允许登录)和WebAPI(允许API调用)执行此满足的CORS要求,但它创建了一个新问题: OPTIONS 在我的API调用的预检期间找不到方法。解决这个问题很简单 - 我只需要删除以下内容 handlers node我的Web.Config:

<remove name="OPTIONSVerbHandler" />

希望这有助于某人。


6
2017-08-05 22:20





实际上你不能设置多个标题 Access-Control-Allow-Origin (或者至少它不适用于所有浏览器)。相反,您可以有条件地设置环境变量,然后使用它 Header 指示:

SetEnvIf Origin "^(https?://localhost|https://[a-z]+\.my\.base\.domain)$" ORIGIN_SUB_DOMAIN=$1
Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN

因此,在此示例中,仅当请求标头时才会添加响应标头 Origin 匹配RegExp: ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$ (它基本上是指基于HTTP或HTTPS的localhost和基于HTTPS的* .my.base.domain)。

记得启用 setenvif 模块。

文档:

BTW。该 }e 在 %{ORIGIN_SUB_DOMAIN}e 不是拼写错误。这就是你如何使用环境变量 Header 指示。


5
2018-06-02 16:11



您是否有不设置多个访问控制标头的来源?我找不到任何证实这一点的东西。 - Spencer
非常智能和清洁的解决方案为我工作。 - Alex Kalmikov
@Spencer“注意:在实践中,origin-list-or-null生产受到更多约束。而不是允许以空格分隔的原始列表,它是 单个原点或字符串“null”“。 w3.org/TR/cors/#access-control-allow-origin-response-header - Nux


Apache服务器:

我花了同样的钱,但那是因为我的文件中没有引号(“)星号提供了对服务器的访问,例如'.htaccess。':

Header add Access-Control-Allow-Origin: * 
Header add Access-Control-Allow-Origin "*" 

你也可能在另一个'.htaccess'输出的文件夹中有一个'.htaccess'文件,例如

/ 
- .htaccess 
- public_html / .htaccess (problem here)

在你的情况下,而不是'*'星号将是IP(http://127.0.0.1:9000)您授予服务数据权限的服务器。

ASP.NET:

检查代码中是否存在“Access-Control-Allow-Origin”副本。

开发者工具:

使用Chrome,您可以验证您的请求标头。按F12键并转到“网络”选项卡,现在运行AJAX请求并显示在列表中,单击并提供所有信息。

Access-Control-Allow-Origin: *


4
2018-03-22 00:41



有时它很容易......当试图让那些混乱的Web服务在IIS / Chrome上运行时,我使用了Application_BeginRequest方法,并忘记了它...在我自己的代码中重复!谢谢你指着我显而易见的! :) - Juergen Riemer
要获取CORS响应标头,您还必须模拟实际的跨源请求,因此如果您只是查看正在运行的站点上的网络选项卡,它可能不会出现。但是,使用类似DHC的东西(chrome.google.com/webstore/detail/dhc-resthttp-api-client/...)运行您的AJAX请求将在技术上从不同的域调用,从而触发CORS并允许您查看Access Control标头。 - Henry C


如果在多个位置配置了Cors选项,则会发生这种情况。在我的例子中,我在控制器级别以及Startup.Auth.cs / ConfigureAuth中使用它。

我的理解是,如果你想要它的应用程序范围,那么只需在Startup.Auth.cs / ConfigureAuth下配置它...你需要参考Microsoft.Owin.Cors

public void ConfigureAuth(IAppBuilder app)
        {
          app.UseCors(CorsOptions.AllowAll);

如果您宁愿将其保持在控制器级别,那么您可以只在控制器级别插入。

[EnableCors("http://localhost:24589", "*", "*")]
    public class ProductsController : ApiController
    {
        ProductRepository _prodRepo;

4
2017-08-09 15:17



在我的例子中,我在Web.Config和MyAppApiConfig.cs中设置了它。从后者中删除它解决了我的问题。 - Jim B


如果你在IIS中,你需要在web.config中激活CORS,那么你不需要在App_Start / WebApiConfig.cs中启用注册方法

我的解决方案是评论这里的线:

// Enable CORS
//EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*");
//config.EnableCors(cors);

并在web.config中写入:

<system.webServer>
  <httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
  </customHeaders>
</httpProtocol>


2
2017-10-26 02:00