Глобальная и локальная настройка CORS

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 22.12.2019

Если мы используем в приложении для создания системы маршрутизации метод app.UseEndpoints(), то мы можем для каждого маршрута указать свои настройки CORS. Таким образом, мы можем установить глобально для всех ресурсов одни и те же настройки CORS, либо конкретизировать для каждого ресурса свои настройки.

В прошлых темах использовалась глобальная настройка CORS, которая предполагает, что настройки CORS передаются в метод app.UseCors():

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

namespace CorsApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(); // добавляем сервисы CORS
        }

        public void Configure(IApplicationBuilder app)
        {
            
            app.UseDeveloperExceptionPage();


            app.UseRouting();

            // глобальная настройка CORS для всех ресурсов
            app.UseCors(builder => builder.AllowAnyOrigin());
			
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
				endpoints.MapGet("/home", async context =>
                {
                    await context.Response.WriteAsync("Home Page!");
                });
            });
        }
    }
}

С помощью метода RequireCors() у объекта IEndpointConventionBuuilder мы можем установить настройки CORS для каждого конкретного маршрута. Данный метод в качестве параметра принимает либо название политики CORS, либо делегат с параметром CorsPolicyBuilder, с помощью который устанавливается конфигурацию CORS.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

namespace CorsApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options => {

                options.AddPolicy("AllowTestSite", builder => builder
                    .WithOrigins("https://localhost:44321")
                    .AllowAnyHeader()
                    .AllowAnyMethod());

                options.AddPolicy("AllowNormSite", builder => builder
                        .WithOrigins("https://localhost.com")
                        .AllowAnyHeader()
                        .AllowAnyMethod());
            });
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseDeveloperExceptionPage();


            app.UseRouting();

            app.UseCors();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                }).RequireCors(options => options.AllowAnyOrigin());

                endpoints.MapGet("/home", async context =>
                {
                    await context.Response.WriteAsync("Home Page!");
                }).RequireCors("AllowNormSite");

                endpoints.MapGet("/about", async context =>
                {
                    await context.Response.WriteAsync("About Page!");
                }).RequireCors("AllowTestSite");
            });
        }
    }
}

Таким образом, мы можем определить для каждого свою конфигурацию CORS.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850