C# .NET核心端点+;全球CORS

C# .NET核心端点+;全球CORS,c#,asp.net-core,cors,asp.net-core-webapi,C#,Asp.net Core,Cors,Asp.net Core Webapi,我在一本书里找到了这个- 我们建议不要合并政策。使用[EnableCors] 属性或中间件,而不是在同一个应用程序中 我的场景非常简单-我想全局启用CORS,但只对一个特定的控制器端点禁用它(端点用于前端小部件,它可以嵌入任何站点,所以我不能在该端点上使用CORS) 我不明白他们为什么反对将这两种方法结合起来——他们不仅不推荐,而且根本不起作用 这是CORS的设置: services.AddCors(opts => { opts.AddPolicy(nameof(MyCorsPol

我在一本书里找到了这个-

我们建议不要合并政策。使用[EnableCors] 属性或中间件,而不是在同一个应用程序中

我的场景非常简单-我想全局启用CORS,但只对一个特定的控制器端点禁用它(端点用于前端小部件,它可以嵌入任何站点,所以我不能在该端点上使用CORS)

我不明白他们为什么反对将这两种方法结合起来——他们不仅不推荐,而且根本不起作用

这是CORS的设置:

services.AddCors(opts =>
{
    opts.AddPolicy(nameof(MyCorsPolicy), new MyCorsPolicy());
});
这是在
Configure
启动方法中的注册

public void Configure(
        IApplicationBuilder app,
        IWebHostEnvironment env)
{
    app.UseRouting();

    app.UseCors(nameof(MyCorsPolicy));
    
    app.UseHsts();
    
    app.UseExceptionHandler(env);

    app.UseAuthentication();
    app.UseAuthorization();
    
    app.UseEndpoints(endpoints => endpoints.MapControllers());
}
现在在我的XY控制器方法中,我有了
[DisableCors]
属性,但它不起作用


任何帮助都将不胜感激。谢谢。

方式1。由于尚未配置默认策略,仅app.UseCors()无法启用CORS。使用
RequireCors
启用所有控制器

     public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseHttpsRedirection();
                app.UseStaticFiles();
                app.UseRouting();
    
                app.UseCors();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
               {
                  endpoints.MapControllers()
                         .RequireCors(MyCorsPolicy);//Enable Cors with endpoint routing

                // /xy/getvalues2 and Razor Pages not allow cross-origin requests because no default policy was specified.
                  endpoints.MapGet("/xy/getvalues2",
                      context => context.Response.WriteAsync("xy/getvalues2")); //do XY Controller Action logic
                  endpoints.MapRazorPages(); 
           });
    }
路2。
[DisableCors]
属性不会禁用端点路由已启用的CORS。使用
[EnableCors(“MyCorsPolicy”)]
为每个控制器启用“
MyCorsPolicy
”CORS策略。禁用GetValues2方法的
CORS

    [EnableCors("MyCorsPolicy")]
    [Route("api/[controller]")]
    [ApiController]
    public class XYController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public IActionResult Get() =>
            ControllerContext.MyDisplayRouteInfo();

     // GET: api/values/GetValues2
        [DisableCors]
        [HttpGet("{action}")]
        public IActionResult GetValues2() =>
            ControllerContext.MyDisplayRouteInfo();

    }

经过数百次测试和内部.NET内核调试,我实现这一点的唯一方法是使用全局CORS:

services.AddCors(opts =>
{
    opts.AddPolicy(nameof(MyCorsPolicy), new MyCorsPolicy());
});
然后我会创建另一个策略

public class AllowAnyCorsPolicy : CorsPolicy
{
    public AllowAnyCorsPolicy()
    {
        Origins.Clear();
        IsOriginAllowed = origin => true;
        Headers.Clear();
        Headers.Add("*");
        
        Methods.Clear();
        Methods.Add("*");

        SupportsCredentials = true;
    }
}
并将该策略应用于特定的控制器方法,例如

[EnableCors(nameof(AllowAnyCorsPolicy))]
[HttpPost("/user/add")]
[AllowAnonymous]
public async Task<IActionResult> AddUser(UserRequestModel requestModel)
{
    // ...
}
[EnableCors(名称(AllowAnyCorsPolicy))]
[HttpPost(“/user/add”)]
[异名]
公共异步任务AddUser(UserRequestModel requestModel)
{
// ...
}

如果我使用了
[DisableCors]
或者甚至使用了默认策略注册,然后将纯
[EnableCors]
属性添加到控制器方法中,它就不会工作。它们的实现方式非常奇怪,因为我认为这可以简化很多,而且我不知道将来会有什么样的行为,所以我们甚至可以考虑编写自己的完整的CORS中间件。

但是,这意味着如果我想使用这种方法,我需要向每个控制器添加<代码> [EnabelReor(MyCorsPolicy)] < /代码>。对吗?没错。[DisableCors]属性不会禁用端点路由已启用的CORS。或者您可以使用第一种方法禁用Cors。