Разные CORS policies для endpoints в ASP.NET
Иногда в приложении нужны разные CORS policies для конкретных endpoints. Представьте, что большинство endpoints вашего API общаются только с frontend, размещенным на sample.com. Вы настраиваете общую CORS policy для этого домена, например AllowSampleCom, и разрешаете requests только с origin sample.com.
Но одному или нескольким endpoints может понадобиться принимать requests с другого домена, например admin-sample.com. В таких случаях удобно создать отдельную policy, например AllowAdminSampleCom, специально под этот домен.
public class Program
{
public void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowSampleCom", policy =>
{
policy.WithOrigins("https://sample.com")
.AllowAnyHeader()
.AllowAnyMethod();
});
options.AddPolicy("AllowAdminSampleCom", policy =>
{
policy.WithOrigins("https://admin-sample.com")
.AllowAnyHeader()
.AllowAnyMethod();
});
});
var app = builder.Build();
app.UseCors("AllowSampleCom");
app.MapControllers();
app.Run();
}
}
Затем можно выборочно применять эту policy к нужным endpoints.
Для controllers используйте attribute:
[EnableCors("AllowAdminSampleCom")]
Для Minimal APIs используйте method:
app.MapGet("/endpoint", handler).RequireCors("AllowAdminSampleCom");
Простой пример controller endpoint:
[ApiController]
[Route("api/[controller]")]
public class SampleController : ControllerBase
{
[HttpPost("AddUser")]
[EnableCors("AllowAdminSampleCom")]
public IActionResult AddUser()
{
// Logic to add a user
return Ok();
}
}
Если нужно полностью отключить CORS для конкретных endpoints, используйте attribute:
[DisableCors]
Такой подход дает гибкость: вы можете настраивать CORS behavior под конкретные потребности каждого endpoint и при этом сохранять backend безопасным и организованным.