Як увімкнути 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.