Сбой CORS для POST в веб-API - PullRequest
       24

Сбой CORS для POST в веб-API

0 голосов
/ 16 октября 2018

Настройка CORS для простого веб-API в базовом приложении .NET У меня есть это:

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 будет работать нормально кросс-домен, но я бы предпочел не просто позволять что-либо.Так чего мне здесь не хватает?

1 Ответ

0 голосов
/ 16 октября 2018

Немного поэкспериментировав, мне показалось, что AllowAllHeaders была необходимой частью, поэтому я покопался немного глубже, чтобы посмотреть, какие заголовки передаются, и, как ни странно, кажется, что это заголовок Content-Type, к которому он подключился.

Так что это сработало (из Chrome в JSFiddle):

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
  • multipart / form-data
  • text / plain

У меня был мой наборна application/json и я думаю, это было то, что ему не понравилось.

...