在 ASP.NET Core 3.1 中处理多个环境的 CORS 策略

Handling CORS policy for multiple environment in ASP.NET Core 3.1

我正在尝试 "toggle" 根据应用程序所处的环境 "toggle" 我的 CORS 策略 运行。

我声明了两个政策如下:

services.AddCors(options =>
{
    options.AddPolicy(CORSPolicies.PublicApi,
        builder => builder
            .AllowAnyHeader()
            .WithMethods("POST", "GET")
            .WithOrigins("https://domain1.com", "https://domain2.com"));

    options.AddPolicy(CORSPolicies.Dev,
        builder => builder
            .AllowAnyHeader()
            .AllowAnyMethod()
            .AllowAnyOrigin());
});

这些策略应该只适用于少数控制器,所以我使用属性来应用它们:

[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
[AllowAnonymous]
[EnableCors(CORSPolicies.PublicApi)]
public class PublicApiControllerBase : ControllerBase
{
}

PublicAPI 策略应该适用于实际限制域的生产环境。 Dev 政策允许任何事情,因为我将在本地使用它。

我试图在应用程序启动时有条件地将默认策略设置为 Dev,但是由于 EnableCorsAttribute 覆盖了 app.UseCors() 定义的内容,因此它不起作用 PublicApi 无论如何都会使用策略。这是我天真的尝试:

if (env.IsDevelopment())
{
    app.UseCors(CORSPolicies.Dev);
}
else
{
    app.UseCors();
}

我如何才能 a) 使我的 PublicApi 政策根据我的应用所处的环境而有所不同 运行 或 b) 有条件地应用 PublicApiDev 政策取决于关于环境?

对于选项A,可以在Startup构造函数中注入IWebHostEnvironment,捕获为字段,在ConfigureServices.

中使用

这是它的样子:

public class Startup
{
    private readonly IWebHostEnvironment env;

    public Startup(IWebHostEnvironment env)
    {
        this.env = env;
    }

    public void ConfigureService(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy(CORSPolicies.PublicApi, builder =>
            {
                if (env.IsDevelopment())
                {
                    builder.AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowAnyOrigin();
                }
                else
                {
                    builder.AllowAnyHeader()
                        .WithMethods("POST", "GET")
                        .WithOrigins("https://domain1.com", "https://domain2.com");
                }
            });
        });

        // ...
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // ...

        app.UseCors();

        // ....
    }
}

这使用单个 CORS 策略,CORSPolicies.PublicApi,根据环境配置。