Як увімкнути CORS в ASP.NET Core


190

Я намагаюсь увімкнути спільний доступ до ресурсів на моєму веб-API ASP.NET Core, але я застряг.

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 на веб-API ASP.NET Core?


Відповіді:


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
Чи є ризики дозволити будь-яке походження?
— Персі

Ця відповідь для мене не спрацювала через відсутність нульового пакету Microsoft.AspNetCore.Cors.
— Ревен

108

Застосовується до .NET Core 1 та .Net Core 2 (далі вниз)

Якщо використовується .Net-Core 1.1

На жаль, документи дуже заплутані в цьому конкретному випадку. Тому я зроблю його мертвим-простим:

  • Додайте Microsoft.AspNetCore.Corsнуд пакет до свого проекту
  • У ConfigureServicesметоді додатиservices.AddCors();
  • У Configureметоді перед тим, як зателефонувати app.UseMvc()та app.UseStaticFiles(), додайте:

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

Це воно. Кожен клієнт має доступ до вашого веб-сайту / API API.


Якщо використовується .Net-Core 2.0

  • Додайте Microsoft.AspNetCore.Corsнуд пакет до свого проекту
  • у 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
Це не працює, я не думаю. Надаючи облікові дані, ви не можете дозволити будь-яке походження. Я все ще намагаюся змусити це працювати.
— Jason Goemaat

7
Ось ключовий твір: .UseCors()раніше.UseMvc()
— Непс

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")]

Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією.
— zrvan

14
To critique or request clarification from an authorЯ не думаю, що це так і тут, і відповідь Хенка вже відзначена. Моєю відповіддю було доповнення, якщо ви хочете дозволити конкретні домени.
— Олувафемі

Щось бракує у вашому коді, "IServiceCollection" не містить визначення для "ConfigureCors". Перевірте це і спробуйте дати повну відповідь.
— Самі-Л

@ Sami-L Перевірте мою оновлену відповідь. Я дізнався, що це ConfigureCorsбуло змінено на AddCors.
— Oluwafemi

9

Зокрема в ядрі dotnet 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/isissue/4483


Використання SignalR в консольній програмі .NET Core, і це єдине робоче рішення для мого сценарію.
— asdf

7

Якщо ви хостите на IIS, одна з можливих причин полягає в тому, що ви отримуєте це через те, що IIS блокує OPTIONSдієслово. Через це я витратив майже годину:

Одне свідчення про те, що ви отримуєте 404помилку під час OPTIONSзапиту.

Щоб виправити це, вам потрібно чітко сказати IIS, щоб не блокувати OPTIONSзапит.

Перейдіть на запит фільтрування:

IIS Запит фільтрації

Переконайтеся, що OPTIONS дозволено:

Переконайтесь, що ВАРІАНТИ вірно

Або просто створіть 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"); у методі "Налаштувати"
— Гаррі Саршог

Важливо "Додайте нульовий пакет 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.

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

Отже, у нашому серверному додатку переходимо до Контролерів -> HomeController.cs і додаємо декоратор EnableCors до методу Index (Або вашого конкретного контролера та дії):

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

Для отримання детальної інформації натисніть тут


0

Всі вищезгадані способи вирішення можуть працювати або не працювати, в більшості випадків це не спрацює. Я дав тут рішення

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

Наведене вище рішення завжди працюватиме. З запитом "OPTIONS" дійсно потрібно включити "Анонімну автентифікацію". Згадане тут рішення не потрібно виконувати всі кроки, згадані вище, як-от налаштування IIS.

У будь-якому разі хтось позначав мою вище публікацію як дублікат цієї публікації, але я можу бачити, що ця публікація лише для того, щоб увімкнути CORS в ASP.net Core, але моя публікація пов'язана з, Увімкненням та реалізацією CORS в ASP.net Core and Angular.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.