CORS 在 web api 中的 POST 失败

Posted

技术标签:

【中文标题】CORS 在 web api 中的 POST 失败【英文标题】:CORS failing for POST in web api 【发布时间】: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 可以跨域正常工作,但我更愿意不只是允许任何事情。那么我在这里错过了什么?

【问题讨论】:

你应用了这个金块吗? "Browsers aren't entirely consistent in how they set Access-Control-Request-Headers. If you set headers to anything other than "*" (or use AllowAnyHeader), you should include at least Accept, Content-Type, and Origin, plus any custom headers that you want to support." @spender - 非常有用,谢谢。我刚刚得出的结论是,是Content-Type 绊倒了它,似乎是因为我将Content-Type 设置为application/json,根据你的链接,Content-Type 只有在以下情况下才会自动通过它是application/x-www-form-urlencodedmultipart/form-datatext/plain 【参考方案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,我想这就是它不喜欢的地方。

【讨论】:

很高兴为您提供帮助:)

以上是关于CORS 在 web api 中的 POST 失败的主要内容,如果未能解决你的问题,请参考以下文章

具有多个 HttpPost 方法的 Web Api 中的 CORS 问题

AWS API Gateway CORS 对 OPTIONS 正常,对 POST 失败

Axios 中的 Cors OPTIONS 方法在 Laravel 和 Nginx 中失败

来自 ASP NET Web API 的 CORS 阻止 Ajax POST 调用 - 对预检请求的响应未通过访问控制检查

Web Api 2 CORS 不适用于 POST

400 仅在启用 cors 时响应 asp.net web api POST 请求