asp.net Core MVC 2 — настройте CORS на принятие нулевого источника

#c# #asp.net-core #.net-core #cors #asp.net-core-mvc

#c# #asp.net-core #.net-ядро #cors #asp.net-core-mvc

Вопрос:

Мне нужно настроить веб-api, реализованный с использованием asp.net ядро 2.2 для принятия «нулевого» источника (заголовок ‘Origin’ отсутствует или пуст).

Прежде чем ты вцепишься мне в горло: Я знаю, что иметь нулевой источник — это плохо. Но, к сожалению, я ничего не могу с этим поделать, потому что вызов выполняется сторонним сервером, который передает null origin, и я не могу его контролировать, поэтому мне нужно заставить мой api принимать null origin.

Я пытался сделать это:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseHsts();
    app.UseMvc();
    app.UseCors(options => options.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials());
}

...

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    //Configuring CORS
    services.AddCors();
}
  

но это не имеет никакого значения. Когда я делаю POST-запрос (используя ajax-метод jQuery), я получаю следующую ошибку:

введите описание изображения здесь

У меня есть подозрение, что нулевой / отсутствующий источник просто отбрасывается, даже не проверяя его … я прав? Есть ли какой-либо способ принять нулевой источник?

Комментарии:

1. Что на самом деле происходит, что заставляет вас думать, что есть проблема? Вы не упомянули никаких реальных исключений или сбоев.

2. @UncleDave: вы правы, я отредактировал вопрос с ошибкой

3. Ваш вопрос относится к вызову, выполняемому сторонним «сервером», тогда как на скриншоте явно изображены chrome dev tools, что означает, что вы отправляете запрос из браузера. Это очень важное различие, поскольку браузер блокирует ответы из-за CORS, а не сервер. Следовательно, если бы вы должны были сделать запрос с другого сервера, а не с браузера, то CORS не входил бы в уравнение. Однако, если вы собираетесь отправлять запросы из браузера, попробуйте перейти app.UseCors выше app.UseMvc .

4. @UncleDave: Я решил проблему (см. Мой ответ). Но чтобы ответить на ваш вопрос: да, я использую свой браузер, но страница, на которой я нахожусь, находится на сервере, который я не контролирую. Рассматриваемая страница содержит несколько фрагментов «в стиле плагина» и использует некоторые приемы песочницы, чтобы изолировать каждый из этих фрагментов (я думаю, что для этого используются iframes). В результате, если вы выполняете вызов из одной из этих «изолированных» частей, исходное значение, которое выходит, равно null, даже если я нахожусь на «реальной» странице с правильным доменным именем и всем остальным.

5. Какое совпадение, я также решил проблему! (смотрите конец моего комментария выше).

Ответ №1:

Промежуточное программное обеспечение CORS должно быть размещено перед промежуточным программным обеспечением MVC, иначе промежуточное программное обеспечение MVC (и ваш контроллер) отправит ответ, не предоставив промежуточному программному обеспечению CORS возможности запуска.

Измените свой метод настройки на этот:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseHsts();
    app.UseCors(options => options.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials());
    app.UseMvc(); // Add this middleware last.
}
  

Порядок AddMvc и AddCors в ConfigureServices методе не имеет значения.

Ответ №2:

Хорошо, я решил эту проблему. Проблема была очень простой: методы UseCors() и AddCors() в классе Startup должны быть вызваны ПЕРЕД методами UseMvc() и AddMvc() .