CORS (Cross-Origin Resource Sharing) — это механизм безопасности, который позволяет веб-приложениям делать запросы к ресурсам на другом домене. По умолчанию браузеры блокируют такие запросы из-за политики одного источника (Same-Origin Policy), но CORS даёт возможность явно разрешать их.
Как работает CORS
Когда браузер отправляет междоменный запрос, сервер может разрешить или запретить его, отправляя специальные заголовки в ответе. Эти заголовки указывают, какие домены, методы и заголовки разрешены.
Основные заголовки CORS
Access-Control-Allow-Origin
— указывает, какие источники могут обращаться к ресурсу.Access-Control-Allow-Methods
— определяет разрешённые HTTP-методы (GET, POST, PUT и др.).Access-Control-Allow-Headers
— указывает, какие заголовки могут передаваться в запросе.Access-Control-Allow-Credentials
— разрешает отправку кук и заголовков авторизации.
Предварительные запросы (Preflight)
Некоторые запросы, например, с нестандартными заголовками или методами, требуют предварительного запроса (OPTIONS). Браузер сначала отправляет запрос OPTIONS, а затем выполняет основной запрос, если сервер разрешил его.
Настройка CORS в ASP.NET Core
В ASP.NET Core CORS настраивается через middleware. Можно указать, какие домены, методы и заголовки разрешены для определённых конечных точек API.
Пример настройки CORS в Program.cs
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowSpecificOrigin",
policy => policy.WithOrigins("https://example.com")
.AllowAnyMethod()
.AllowAnyHeader());
});
var app = builder.Build();
app.UseCors("AllowSpecificOrigin");
app.UseAuthorization();
app.MapControllers();
app.Run();
Безопасность при настройке CORS
- Не указывать
*
вAccess-Control-Allow-Origin
, если требуется защита данных. - Ограничивать доступ к API только для доверенных доменов.
- Разрешать куки и заголовки авторизации только при необходимости.
- Контролировать методы и заголовки, доступные клиентам.
Правильная настройка CORS позволяет безопасно работать с междоменными запросами, избегая проблем с безопасностью и доступом к API.