繁体   English   中英

.NET 核心端点 + 全局 CORS

[英].NET Core Endpoint + Global CORS

我在官方文档中找到了这个-

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

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

我不明白为什么他们建议不要将这两种方法结合起来——他们不仅不推荐,而且根本行不通。

这是 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 controller 方法中,我的[DisableCors]属性不起作用。

任何帮助,将不胜感激。 谢谢你。

经过数百次测试和内部 .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;
    }
}

并将该策略应用于特定的 controller 方法,例如

[EnableCors(nameof(AllowAnyCorsPolicy))]
[HttpPost("/user/add")]
[AllowAnonymous]
public async Task<IActionResult> AddUser(UserRequestModel requestModel)
{
    // ...
}

如果我使用[DisableCors]甚至使用默认策略注册,然后将纯[EnableCors]属性添加到 controller 方法,它就是行不通的。 他们的实现方式非常奇怪,因为我认为这可以简化很多,而且我不知道将来会如何表现,所以我们甚至可以考虑编写我们自己的完整 CORS 中间件。

方式 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")]为每个 controller 启用“ 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();

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM