【问题标题】:CORS failing for POST in web apiCORS 在 web api 中的 POST 失败
【发布时间】:2019-03-21 00:55:27
【问题描述】:

在 .NET 核心应用程序中为简单的 web api 设置 CORS 我有这个:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("GetPolicy",
            builder => builder.AllowAnyOrigin()
                .WithMethods("GET")
                .WithHeaders("x-mycustomheader-cors"));

        options.AddPolicy("PostPolicy",
            builder => builder.AllowAnyOrigin()
                .WithMethods("POST")
                .WithHeaders("x-mycustomheader-cors"));
    });

    services.AddMvc();
}

我有一个像这样设置并且工作正常的 get 端点:

[HttpGet]
[EnableCors("GetPolicy")]
[AuthorizationFilter]
public IEnumerable<MyModel> Get()
{
    //...
}

效果很好,但这(在不同的控制器中):

[HttpPost]
[EnableCors("PostPolicy")]
[AuthorizationFilter]
public void Post([FromBody]MyOtherModel[] models)
{
    //...
}

失败:

对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

如果我将PostPolicy 更改为:

options.AddPolicy("PostPolicy",
    builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());

然后 POST 可以跨域正常工作,但我更愿意不只是允许任何事情。那么我在这里错过了什么?

【问题讨论】:

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


【解决方案1】:

尝试了一下,似乎AllowAllHeaders 是必要的部分,所以我更深入地研究了正在传递的标头,奇怪的是,它似乎是Content-Type 标头被绊倒了。

所以这有效(来自 JSFiddle 中的 Chrome):

options.AddPolicy("PostPolicy",
                builder => builder.AllowAnyOrigin()
                .WithMethods("POST")
                .WithHeaders("x-chmura-cors", "Content-Type"));

这令人惊讶,因为我原以为不需要明确包含标准标头(如 Content-Type)。

当然,错误消息完全没有帮助。

编辑

所以根据这个:https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.1#preflight-requests(感谢@spender),问题是Content-Type只有在它的值是:

Content-Type 标头(如果已设置)具有以下值之一:

  • application/x-www-form-urlencoded
  • 多部分/表单数据
  • 文本/纯文本

我将我的设置为application/json,我想这就是它不喜欢的地方。

【讨论】:

  • 很高兴为您提供帮助:)
猜你喜欢
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2018-12-08
  • 2022-08-16
  • 1970-01-01
  • 2019-08-23
  • 2019-02-04
相关资源
最近更新 更多