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

Posted

技术标签:

【中文标题】在 ASP.NET Core 3.1 中处理多环境的 CORS 策略【英文标题】:Handling CORS policy for multiple environment in ASP.NET Core 3.1 【发布时间】: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 策略,具体取决于环境?

【问题讨论】:

【参考方案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,它是根据环境配置的。

【讨论】:

以上是关于在 ASP.NET Core 3.1 中处理多环境的 CORS 策略的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 3.1 中的数据表服务器端处理

如何在 ASP.NET Core 3.1 生产中配置 IdentityServer

HTTP 错误 500.0 - Dot net core 3.1 中的 ASP.NET Core IIS 托管失败(进程中)

ASP.NET Core 3.1 Razor 页面路由不明确匹配异常

如何使用 C# 在 ASP.NET Core 3.1 MVC 中使用会话变量

ASP.NET Core 3.1 Azure AD 身份验证引发 OptionsValidationException