【问题标题】:CORS - Why do I get multiple values in my Access-Control-Allow-Origin headerCORS - 为什么我的 Access-Control-Allow-Origin 标头中有多个值
【发布时间】:2022-11-11 00:07:13
【问题描述】:

我有一个 API,从面向公众的网站调用一个端点。每当网站调用 API 时,我都会收到以下错误

Access to fetch at '{{API Endpoint}}' from origin 'https://{{Website Domain}}' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values 'https://{{Website Domain}}, *', but only one is allowed. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

我的 API 的 Program.cs 似乎设置正确

builder.Services.AddCors(options =>
{
    options.AddPolicy(
        "CMSPolicy",
        policy =>
        {
            policy.WithOrigins("https://{{Website Domain}})
                .WithHeaders(HeaderNames.ContentType, "application/json");
        });
});



app.UseCors();

我的控制器在端点上有 [EnableCors("CMSPolicy")] 注释。

这以前是可行的,但是已经进行了更改,API 现在导入了一个定制的 NuGet 包,该包本身包含一些控制器。这些导入的控制器与受影响的控制器无关,并且定制包不包含我可以看到的任何引用 CORS 的代码,但为了完整性,我将包含此信息以防相关。

如果我从我的端点中删除 EnableCors 注释,那么来自网站的调用可以工作,但那是 Access-Control-Allow-Origin 标头值为“*”,我希望这个标头的安全性只是我的网站域

【问题讨论】:

  • 目前policy.WithOrigins(... 行中似乎有一个开/关引号不匹配
  • 这只是我在取出实际域名时的错误 - 在代码中很好

标签: c# asp.net-core cors asp.net-core-6.0


【解决方案1】:

我发现了问题,原来项目设置的一部分(在本例中是为 API 设置 Docker 映像)正在将“access-control-allow-origin: *”标头插入到来自 API 的每个响应中,然后 EnableCors 属性只是添加另一个而不是替换现有标题,因此出现了问题。

【讨论】:

    【解决方案2】:

    我做了一个测试,没有问题,你可以参考一下:

    程序.cs:

    builder.Services.AddCors(options =>
    {
        options.AddPolicy(name: "CMSPolicy",
                          policy =>
                          {
                              policy.WithOrigins("https://localhost:7010")
                                .WithHeaders(HeaderNames.ContentType, "application/json");
                          });
    });
    //...
    app.UseCors();
    

    控制器:

    [EnableCors("CMSPolicy")]
    public class WeatherForecastController : ControllerBase {}
    

    结果:

    确保您的开/关引号匹配并且app.UseCors(); 在正确的位置。对UseCors 的调用必须放在UseRouting 之后,但在UseAuthorization 之前。

    更多详情请参考CORS with named policy and middleware

    【讨论】:

    • 谢谢。我确实有 app.UseCors() 语句的顺序错误,但只是改变它并不能解决问题。
    猜你喜欢
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2019-06-17
    • 2019-02-07
    • 2018-08-30
    • 2016-09-09
    相关资源
    最近更新 更多