Как включить 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.