代码之家  ›  专栏  ›  技术社区  ›  Matt Burland

CORS在web api中发布失败

  •  1
  • Matt Burland  · 技术社区  · 8 年前

    在.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();
    }
    

    [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());
    

    然后后将工作罚款跨域,但我宁愿不只是允许任何事情。那我还缺什么?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Community Mohan Dere    6 年前

    尝试一下,似乎 AllowAllHeaders 是必要的部分,所以我挖了更深一点,看看什么标题正在通过,奇怪的是,它似乎是 Content-Type

    所以这是有效的(从JSFiddle中的Chrome):

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

    内容类型 )不需要明确包括在内。

    编辑

    https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.1#preflight-requests (感谢@spender),问题是 内容类型 仅当其值为:

    内容类型标头(如果已设置)具有以下值之一:

    • 应用程序/x-www-form-urlencoded
    • 多部分/窗体数据
    • 文本/纯文本

    我已经准备好了 application/json 我想这就是它不喜欢的。