在 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) 有条件地应用 PublicApi
或 Dev
政策取决于关于环境?
对于选项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
,根据环境配置。
我正在尝试 "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) 有条件地应用 PublicApi
或 Dev
政策取决于关于环境?
对于选项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
,根据环境配置。