ASP.NET 5/Core/vNext CORS не работает, даже если позволяет почти все

У меня есть ASP.NET 5 Web API (ну, во всяком случае, MVC), который я потребляю с помощью axios в моем приложении JS.

Конфигурация My CORS в MVC следующая:

public void ConfigureServices(IServiceCollection services)
{
      services.AddMvc();
      services.AddCors();
} 


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{ 
      app.UseCors(builder => {
          builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
      });
}

Иными словами, я должен разрешить любой запрос. Однако, хотя эти исправленные запросы предполетных запросов, запросы POST по-прежнему отклоняются (я вижу, что он выполняется на сервере, но в ответе нет заголовка, что приводит к ошибке на стороне клиента).

Есть ли у кого-нибудь идеи, почему это не сработает?

Это заголовки, возвращаемые MVC api:

  • Для предварительного предлога OPTIONS (этот прогон): Ответы OPTIONS
  • Для фактического запроса POST (этот не проходит): Ответ POST

Ответ 1

Проблема заключалась в том, что в обработке обработки запроса POST было исключение, и, как отметил Norgerman, обработчик исключений по умолчанию очистил заголовки CORS.

Ответ 2

Вы должны добавить Cors перед MVC. Порядок регистрации промежуточного программного обеспечения важен. Если Cors зарегистрирован после mvc, он никогда не будет вызван. Они вызываются в порядке регистрации.

Как только процесс обрабатывает запрос, он передаст его следующему промежуточному программному обеспечению (Mvc)

Ответ 3

Это работает для меня:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{ 
    app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials());
}

Ответ 4

@Норгерман упомянул об этом в комментариях, но я думаю, что это достойно ответа, потому что я сделал эту ошибку сам несколько раз:

Средство промежуточного программного обеспечения CORS работает только с фактическими междоменными запросами

Урок не, если вы просто обращаетесь к одному и тому же запросу домена, например, введя URL-адрес в браузер.

Это означает, что если вы тестируете, вам нужно либо использовать фактический кросс-доменный запрос от клиента XHR на другом порту или домене, либо HTTP-клиент, который может явно вызывать заголовок origin в HTTP-запрос.

Ответ 5

Предполагая, что вы пытаетесь создать действительно ОБЩЕСТВЕННУЮ конечную точку, это сработало для меня:

Убедитесь, что это:

app.UseCors(builder => {
    builder.AllowAnyOrigin()
    builder.AllowAnyMethod()
    builder.AllowAnyHeader()
});

Происходит перед любым из них:

app.UseHttpsRedirection();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseCookiePolicy();

app.useMvc();

Помните, мы имеем дело с "конвейером". Материал Cors должен быть первым.

Также - (опять же, я полагаю, "публичная конечная точка") - убедитесь, что ваш вызов XHR имеет...   xhr.withCredentials = false;

... или просто опустить это. Если для него установлено значение "true", вы получите предупреждение CORS о "подстановочном знаке".

Ответ 6

Это то, что сработало для меня, так как у меня была такая же проблема с CORS в сочетании с axios.

Предполагая, что вы правильно настроили API и украсили класс в контроллере API:

[EnableCors("YourCorsPolicy")]

(вам нужно будет добавить выражение "using Microsoft.AspNetCore.Cors;" и в ваш класс)

Затем вам нужно использовать следующее в вашем файле axios-auth.js:

axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*'

Это тогда работало хорошо для меня по https. Это мой полный axios-auth, если вам нужно руководство.

import axios from 'axios'

const instance = axios.create({
  baseURL: 'https://localhost:56799/api'
})

axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*'
axios.defaults.headers.get['Accepts'] = 'application/json'
axios.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8'

export default instance

Я надеюсь, что это полезно.

Ответ 7

Обратите внимание, что брандмауэр Windows и проект .vs\config\applicationhost.config должны быть правильно настроены, кроме включения CORS в вашем проекте. Контрольный список ниже может помочь:

  • Является ли порт, используемый вашим приложением /API открытым в брандмауэре? Если нет, откройте его.

  • Откройте файл проекта .vs\config\applicationhost.config и выполните поиск <binding protocol="http" bindingInformation="*:NNNNN:localhost" /> (где NNNNN - номер IP-порта, используемого вашим приложением /API ). После этого добавьте вторую строку, <binding protocol="http" bindingInformation="*:NNNNN:*" />, чтобы вы разрешили любому IP-адресу получать доступ к вашему приложению.

Перезагрузите IIS Express и помните, что часто выполняемая Visual Studio в качестве администратора важна.

После этого продолжите настройку и тестирование CORS.