Cross-Origin Resource Sharing (CORS) - механизм, позволяющий браузеру получать ресурсы с сервера, расположенного на другом домене (origin). Без CORS такие запросы блокируются политикой безопасности браузера (Same-Origin Policy).
var builder = WebApplication.CreateBuilder(args);
// Добавляем сервисы CORS
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(policy =>
{
policy.WithOrigins("https://example.com", "http://localhost:3000")
.AllowAnyHeader()
.AllowAnyMethod();
});
});
var app = builder.Build();
// Включаем CORS middleware
app.UseCors(); // Для дефолтной политики
app.MapControllers();
app.Run();
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowFrontend",
builder => builder.WithOrigins("https://frontend.com")
.AllowAnyMethod()
.AllowAnyHeader());
options.AddPolicy("AllowAll",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
});
[ApiController]
[Route("api/[controller]")]
[EnableCors("AllowFrontend")] // Для всего контроллера
public class ProductsController : ControllerBase
{
[HttpGet]
[EnableCors("AllowAll")] // Переопределение для конкретного действия
public IActionResult Get() => Ok();
}
options.AddPolicy("SecurePolicy", builder =>
{
builder.WithOrigins("https://trusted.com")
.AllowCredentials() // Для работы с куками/аутентификацией
.AllowAnyHeader()
.AllowAnyMethod();
});
Порядок middleware:
UseCors()
должен идти после UseRouting()
, но перед UseAuthorization()
app.UseRouting();
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
Методы HTTP:
Ограничения:
AllowAnyOrigin()
нельзя использовать с AllowCredentials()
WithOrigins()
Ошибки CORS:
Access-Control-Allow-Origin
в ответеПример теста с 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.