← Назад ко всем статьям

Разные CORS policies для endpoints в ASP.NET

Опубликовано

Разные 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 безопасным и организованным.