在 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) 有条件地应用 PublicApi
或 Dev
策略,具体取决于环境?
【问题讨论】:
【参考方案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 生产中配置 IdentityServer
HTTP 错误 500.0 - Dot net core 3.1 中的 ASP.NET Core IIS 托管失败(进程中)
ASP.NET Core 3.1 Razor 页面路由不明确匹配异常