Как включить CORS в ASP.NET Core


190

Я пытаюсь включить общий доступ к ресурсам через мой исходный интерфейс ASP.NET Core Web API, но я застрял.

EnableCorsАтрибут принимает policyNameтипа в stringкачестве параметра:

// Summary:
//     Creates a new instance of the Microsoft.AspNetCore.Cors.Core.EnableCorsAttribute.
//
// Parameters:
//   policyName:
//     The name of the policy to be applied.
public EnableCorsAttribute(string policyName);

Что policyNameозначает и как я могу настроить CORS в ASP.NET Core Web API?


Ответы:


328

Вы должны настроить политику CORS при запуске приложения в ConfigureServicesметоде:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    }));

    // ...
}

CorsPolicyBuilderВ builderпозволяет настроить политику для ваших нужд. Теперь вы можете использовать это имя для применения политики к контроллерам и действиям:

[EnableCors("MyPolicy")]

Или примените его к каждому запросу:

public void Configure(IApplicationBuilder app)
{
    app.UseCors("MyPolicy");

    // ...

    // This should always be called last to ensure that
    // middleware is registered in the correct order.
    app.UseMvc();
}

12
Я обнаружил, что app.UseCors («MyPolicy») не работает для моих конечных точек API. Мне нужно было явно [EnableCors ("MyPolicy")] на рассматриваемых конечных точках контроллера.
— robbpriestley

9
Из официальных документов : «Чтобы включить CORS для всего вашего приложения, добавьте промежуточное программное обеспечение CORS в свой конвейер запросов, используя UseCorsметод расширения. Обратите внимание, что промежуточное программное обеспечение CORS должно предшествовать любым определенным конечным точкам в вашем приложении, которые вы хотите поддерживать между источниками запросов (например, перед любым звонком UseMvc).
— Алекс Клаус

2
Я добавил app.UseCors () после app.AddMvc (), и это не сработало. Потому что порядок использования методов влияет на работу промежуточного программного обеспечения!
— Обай Абд-Альгадер

1
Есть ли риск допустить любое происхождение?
— Перси

Этот ответ не сработал для меня из-за отсутствия пакета Nuget Microsoft.AspNetCore.Cors.
— Ревен

108

Относится к .NET Core 1 и .Net Core 2 (далее)

При использовании .Net-Core 1.1

К сожалению, документы в этом конкретном случае очень запутанные. Так что я сделаю это очень просто:

  • Добавьте Microsoft.AspNetCore.Corsпакет nuget в свой проект
  • В ConfigureServicesметод добавьтеservices.AddCors();
  • В Configureметоде перед вызовом app.UseMvc()и app.UseStaticFiles()добавьте:

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

Вот и все. Каждый клиент имеет доступ к вашему основному веб-сайту / API ASP.NET.


При использовании .Net-Core 2.0

  • Добавьте Microsoft.AspNetCore.Corsпакет nuget в свой проект
  • в ConfigureServicesметоде перед вызовом services.AddMvc()добавьте:

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
  • (Важно) В Configureметоде перед вызовом app.UseMvc()добавьте app.UseCors("AllowAll");

    AllowAllэто имя политики, которое мы должны упомянуть в app.UserCors. Это может быть любое имя.


2
правда, думал, что смогу включить только один из них!
— eugeneK

7
Спасибо. У меня были AddCors после UseMvc, и это заставляло его работать неправильно. Ваш единственный ответ, который упоминает об этом.
— JesseNewman19

1
Это не работает, я не думаю. При предоставлении учетных данных вы не можете разрешить никакого происхождения. Я все еще пытаюсь заставить это работать.
— Джейсон Гомаат

7
Это ключевая часть: .UseCors()перед.UseMvc()
— NEPS

3
Потраченное время, не зная о UseCors до UserMvc ... спасибо за помощь!
— Томас

37

Основываясь на ответе Хенка, я смог придумать конкретный домен, метод, который я хочу разрешить, а также заголовок, который я хочу включить CORS для:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
         options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
                                                   .WithMethods("GET")
                                                   .WithHeaders("name")));
    services.AddMvc();
}

использование:

[EnableCors("AllowSpecific")]

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом.
— Зрван

14
To critique or request clarification from an authorЯ не думаю, что это так, и ответ Хенка уже отмечен. Мой ответ был дополнением, если вы хотите разрешить определенные домены.
— Олувафеми,

В вашем коде чего-то не хватает, IServiceCollection не содержит определения для ConfigureCors. Пожалуйста, проверьте это и попробуйте дать полный ответ.
— Сами-L

@ Sami-L Пожалуйста, проверьте мой обновленный ответ. Я узнал, что ConfigureCorsбыло изменено на AddCors.
— Олувафеми

9

В частности, в dotnet core 2.2 с SignalR вы должны изменить

.WithOrigins("http://localhost:3000") или

.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins

вместо того, чтобы .AllowAnyOrigin()с.AllowCredentials()

https://trailheadtechnology.com/breaking-change-in-aspnetcore-2-2-for-signalr-and-cors/

https://github.com/aspnet/AspNetCore/issues/4483


Использование SignalR в консольном приложении .NET Core, и это единственное рабочее решение для моего сценария.
— asdf

7

Если вы размещаете на IIS, одна из возможных причин этого заключается в том, что IIS блокирует OPTIONSглагол. Я провел почти час из-за этого:

Одно контрольное указание - вы получаете 404ошибку во время OPTIONSзапроса.

Чтобы это исправить, нужно явно указать IIS не блокировать OPTIONSзапрос.

Перейти к фильтрации запросов:

Фильтрация запросов IIS

Убедитесь, что опции доступны:

Убедитесь, что ОПЦИИ верны

Или просто создайте web.configсо следующей настройкой:

<system.webServer>
    <security>
        <requestFiltering>
            <verbs>
                <remove verb="OPTIONS" />
                <add verb="OPTIONS" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>
</system.webServer>

7

Вы должны настроить в классе Startup.cs

services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
        });

5

`

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("AllowAnyOrigin",
                builder => builder
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());
        });

        services.Configure<MvcOptions>(options => {
            options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAnyOrigin"));
        });            
    }

`


1
Прекрасный способ обойти уже развернутую безопасность браузера. Просто не надо!
— JCKödel

2
Я не думаю, что это должно быть понижено. Это «альтернативный» способ. Вы можете использовать метод UseCors () или добавить глобальный фильтр MVC, как это делал Натан.
— Джош Моуч

это работает для меня на .net core 2.2 плюс добавление app.UseCors ("AllowAnyOrigin"); в методе «Настроить»
— Гарри Саршог

Важно "Добавить пакет Nuget Microsoft.AspNetCore.Cors в ваш проект". Спасибо за упоминание этого!
— Мейсон Чжан

5

Получил это работать с .Net Core 3.1 следующим образом

1. Убедитесь, что вы поместили код UseCors между app.UseRouting (); и app.UseAuthentication ();

        app.UseHttpsRedirection();

        app.UseRouting();
        app.UseCors("CorsApi");

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints => {
            endpoints.MapControllers();
        });

2. Затем поместите этот код в метод ConfigureServices.

services.AddCors(options =>
        {
            options.AddPolicy("CorsApi",
                builder => builder.WithOrigins("http://localhost:4200", "http://mywebsite.com")
            .AllowAnyHeader()
            .AllowAnyMethod());
        });

3.И над базовым контроллером я разместил этот

[EnableCors("CorsApi")]
[Route("api/[controller]")]
[ApiController]
public class BaseController : ControllerBase

Теперь все мои контроллеры будут наследоваться от BaseController и иметь включенный CORS


Вещи не работали на меня, пока яplace the UseCors code between app.UseRouting(); and app.UseAuthentication();
— 0014

1

Шаг 1: Нам нужен пакет Microsoft.AspNetCore.Cors в нашем проекте. Для установки зайдите в Инструменты -> Диспетчер пакетов NuGet -> Управление пакетами NuGet для решения. Найдите файл Microsoft.AspNetCore.Cors и установите пакет.

Шаг 2: Нам нужно внедрить CORS в контейнер, чтобы он мог использоваться приложением. В классе Startup.cs давайте перейдем к методу ConfigureServices и зарегистрируем CORS.

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

Итак, в нашем серверном приложении давайте перейдем к Controllers -> HomeController.cs и добавим декоратор EnableCors в метод Index (или ваш конкретный контроллер и действие):

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

Для получения более подробной информации нажмите здесь


0

Все обходные пути, упомянутые выше, могут работать или не работать, в большинстве случаев это не будет работать. Я дал решение здесь

В настоящее время я работаю над Angular и Web API (.net Core) и столкнулся с проблемой CORS, описанной ниже.

Решение, представленное выше, всегда будет работать. С запросом «OPTIONS» действительно необходимо включить «Anonymous Authentication». С упомянутым здесь решением вам не нужно делать все шаги, упомянутые выше, например, настройки IIS.

В любом случае, кто-то пометил мой пост как дубликат этого поста, но я вижу, что этот пост предназначен только для включения CORS в ASP.net Core, но мой пост связан с тем, Включение и внедрение CORS в ASP.net Core и Angular.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.