tuc*_*caz 6 c# cors asp.net-core asp.net-core-3.1
我正在尝试根据应用程序运行的环境在我的 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());
});
Run Code Online (Sandbox Code Playgroud)
这些策略应该只适用于少数控制器,所以我使用属性来应用它们:
[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
[AllowAnonymous]
[EnableCors(CORSPolicies.PublicApi)]
public class PublicApiControllerBase : ControllerBase
{
}
Run Code Online (Sandbox Code Playgroud)
PublicAPI策略应该对域将实际受到限制的生产有效。Dev政策允许任何事情,因为我将在本地使用它。
我试图将默认策略设置为以Dev应用程序启动为条件,但由于EnableCorsAttribute覆盖了它定义的内容,app.UseCors()因此PublicApi无论什么策略都将被使用,因此它不起作用。这是我天真的尝试:
if (env.IsDevelopment())
{
    app.UseCors(CORSPolicies.Dev);
}
else
{
    app.UseCors();
}
Run Code Online (Sandbox Code Playgroud)
我如何 a)PublicApi根据我的应用程序运行的环境使我的策略行为不同或 b)根据环境有条件地应用PublicApi或Dev策略?
对于选项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();
        // ....
    }
}
Run Code Online (Sandbox Code Playgroud)
这使用CORSPolicies.PublicApi根据环境配置的单个 CORS 策略。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           460 次  |  
        
|   最近记录:  |