Asp.net core 在ASP.NET核心中组合默认和命名CORS策略

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

在我的ASP.NET Core 3.1 web API应用程序中,我希望启用从一个来源到所有端点的跨站点请求,以及从另一个来源到特定来源的跨站点请求。(这些也可能允许来自第一个来源的请求,我不在乎。)

所以听起来我想要一个默认策略和命名策略的组合。谈到了单独使用它们,但没有谈到将它们结合起来,我无法让它发挥作用

    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!很高兴听到你解决了这个问题,祝贺你!