Как включить CORS в AspNetCore?csharp-125

1. Что такое CORS?

Cross-Origin Resource Sharing (CORS) - механизм, позволяющий браузеру получать ресурсы с сервера, расположенного на другом домене (origin). Без CORS такие запросы блокируются политикой безопасности браузера (Same-Origin Policy).

2. Базовая настройка CORS

2.1. Добавление сервисов CORS в DI контейнер

var builder = WebApplication.CreateBuilder(args);

// Добавляем сервисы CORS
builder.Services.AddCors(options =>
{
    options.AddDefaultPolicy(policy =>
    {
        policy.WithOrigins("https://example.com", "http://localhost:3000")
              .AllowAnyHeader()
              .AllowAnyMethod();
    });
});

2.2. Подключение middleware CORS

var app = builder.Build();

// Включаем CORS middleware
app.UseCors(); // Для дефолтной политики

app.MapControllers();
app.Run();

3. Расширенные сценарии

3.1. Несколько именованных политик

builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowFrontend",
        builder => builder.WithOrigins("https://frontend.com")
                         .AllowAnyMethod()
                         .AllowAnyHeader());

    options.AddPolicy("AllowAll",
        builder => builder.AllowAnyOrigin()
                         .AllowAnyMethod()
                         .AllowAnyHeader());
});

3.2. Применение политик к контроллерам/действиям

[ApiController]
[Route("api/[controller]")]
[EnableCors("AllowFrontend")] // Для всего контроллера
public class ProductsController : ControllerBase
{
    [HttpGet]
    [EnableCors("AllowAll")] // Переопределение для конкретного действия
    public IActionResult Get() => Ok();
}

3.3. Настройка с учетов credentials

options.AddPolicy("SecurePolicy", builder =>
{
    builder.WithOrigins("https://trusted.com")
           .AllowCredentials() // Для работы с куками/аутентификацией
           .AllowAnyHeader()
           .AllowAnyMethod();
});

4. Важные нюансы

  1. Порядок middleware:

    • UseCors() должен идти после UseRouting(), но перед UseAuthorization()
    • Пример правильного порядка:
      app.UseRouting();
      app.UseCors();
      app.UseAuthentication();
      app.UseAuthorization();
      
  2. Методы HTTP:

    • Для preflight запросов (OPTIONS) CORS middleware должен быть включен
  3. Ограничения:

    • AllowAnyOrigin() нельзя использовать с AllowCredentials()
    • Для credentials нужно явно указывать домены в WithOrigins()
  4. Ошибки CORS:

    • Проверяйте заголовки Access-Control-Allow-Origin в ответе
    • Используйте браузерные инструменты разработчика для диагностики

5. Тестирование CORS

Пример теста с HttpClient:

[Fact]
public async Task Get_WithCorsPolicy_ReturnsCorrectHeaders()
{
    // Arrange
    var client = _factory.CreateClient();
    var origin = "https://example.com";
    client.DefaultRequestHeaders.Add("Origin", origin);

    // Act
    var response = await client.GetAsync("/api/products");

    // Assert
    response.Headers.GetValues("Access-Control-Allow-Origin")
            .Should().Contain(origin);
}

Резюмируем:

для включения CORS в ASP.NET Core нужно зарегистрировать сервисы через AddCors(), добавить middleware через UseCors(), и при необходимости настроить именованные политики. Всегда ограничивайте разрешенные домены в production и учитывайте особенности работы с credentials.