Как включить CORS в ядре ASP.NET

Я пытаюсь разрешить совместное использование ресурсов перекрестного происхождения в моем 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 в базовом веб-API ASP.NET?

Ответ 1

Необходимо настроить политику 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();
}

Ответ 2

Относится к .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. Это может быть любое имя.

Ответ 3

Основываясь на ответе Henk, я смог найти конкретный домен, метод, который я хочу разрешить, а также заголовок, который я хочу включить 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")]

Ответ 5

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

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

Ответ 6

`

    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"));
        });            
    }

`

Ответ 7

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

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

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

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

IIS Request Filtering

Убедитесь, что разрешены опции:

Make sure OPTIONS is True

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

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