【问题标题】:Handling CORS policy for multiple environment in ASP.NET Core 3.1在 ASP.NET Core 3.1 中处理多环境的 CORS 策略
【发布时间】:2020-07-16 22:08:18
【问题描述】:

我正在尝试根据应用程序运行的环境在我的 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 策略,具体取决于环境?

【问题讨论】:

    标签: c# asp.net-core cors asp.net-core-3.1


    【解决方案1】:

    对于选项A,您可以将IWebHostEnvironment 注入Startup 构造函数,将其捕获为字段,并在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,它是根据环境配置的。

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 2020-04-06
      • 1970-01-01
      • 2020-07-09
      • 2022-10-30
      • 2020-03-01
      • 2020-11-02
      • 2021-07-20
      • 1970-01-01
      相关资源
      最近更新 更多