Asp.net core 在ASP.NET核心中组合默认和命名CORS策略
在我的ASP.NET Core 3.1 web API应用程序中,我希望启用从一个来源到所有端点的跨站点请求,以及从另一个来源到特定来源的跨站点请求。(这些也可能允许来自第一个来源的请求,我不在乎。) 所以听起来我想要一个默认策略和命名策略的组合。谈到了单独使用它们,但没有谈到将它们结合起来,我无法让它发挥作用Asp.net core 在ASP.NET核心中组合默认和命名CORS策略,asp.net-core,cors,Asp.net Core,Cors,在我的ASP.NET Core 3.1 web API应用程序中,我希望启用从一个来源到所有端点的跨站点请求,以及从另一个来源到特定来源的跨站点请求。(这些也可能允许来自第一个来源的请求,我不在乎。) 所以听起来我想要一个默认策略和命名策略的组合。谈到了单独使用它们,但没有谈到将它们结合起来,我无法让它发挥作用 public void ConfigureServices(IServiceCollection services) { services.AddCors
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddDefaultPolicy(CreateDefaultCorsPolicy);
options.AddPolicy(OtherCorsPolicyName, CreateOtherCorsPolicy);
});
...
public virtual void Configure(IApplicationBuilder app)
{
...
app.UseRouting();
...
app.UseCors(); // Either this works...
app.UseCors(OtherCorsPolicyName); // ... or this!
...
app.UseEndpoints(SetupEndpoints);
...
在某些控制器方法上,我有:
[EnableCors(OtherCorsPolicyName)]
public string SomeControllerMethod()
当我使用
curl-H“Origin:test_Origin”-H“访问控制请求方法:获取”-H“访问控制请求头:X-Request-with”-X选项-I测试它时http://localhost:5000/...
这些策略一次只能运行一个。如果我注释掉app.UseCors()
然后SomeControllerMethod
上的命名策略工作。如果我注释掉app.UseCors(OtherCorsPolicyName)代码>则默认策略有效。有没有办法让他们一起工作
我甚至无法通过使用我的“默认”策略装饰我的控制器来让两个命名的策略协同工作-我仍然没有返回任何访问控制允许原点标头。我正在使用端点路由,这不会自动允许飞行前请求。解决方案有两个方面:
app.UseCors()
,但不使用策略名称将CORS中间件添加到管道中,但默认情况下不启用CORS[HttpOptions
]添加到任何具有[EnableCors]
的API方法中,使其支持飞行前请求 public virtual void Configure(IApplicationBuilder app)
{
...
app.UseRouting();
...
app.UseCors(); // No policy name!
...
app.UseEndpoints(SetupEndpoints);
...
关于控制器方法:
[HttpGet, HttpOptions]
[EnableCors(OtherCorsPolicyName)]
public string SomeControllerMethod()
“有没有办法让它们一起工作?”你为什么要一起使用它们?它们都用于设置默认的CORS策略,您应该使用其中一个策略作为默认策略,然后,对于另一个策略,您可以或使用。我尝试过,但是
[EnableCors(OtherCorsPolicyName)]
似乎没有任何效果(我没有得到任何访问控制头),除非我还有app.UseCors(OtherCorsPolicyName)
。所以也许这是我应该问的“真正的问题”,但当时我不确定。。。。当然,为所有控制器设置OtherCorsPolicyName
,而不仅仅是那些-oops!谢谢你指出这一点!我找到了答案,并发布了自己的答案。谢谢你给我指出了正确的轨道@ZhiLv!很高兴听到你解决了这个问题,祝贺你!