欢迎光临
个人技术文档整理

.net core跨域配置

安装程序CORS程序包

//一般默认都带了此程序包的
Install-Package Microsoft.AspNetCore.Mvc.Cors

 

ConfigureServices配置服务

 public void ConfigureServices(IServiceCollection services)
        {
            //允许跨域
            services.AddCors(options =>
            {

                //方法一:不做任何限制,允许所有来源
                options.AddPolicy("any", policy =>
                {
                    policy.SetIsOriginAllowed(_ => true)
                           .AllowAnyHeader()
                           .AllowAnyMethod()
                           .AllowCredentials();
                });


                //方法二:可信列表,允许一个或多个具体来源
                options.AddPolicy("allow_list",
                        policy =>
                        {
                            policy.WithOrigins("http://*.loc.net", "https://*.loc.net", "http://localhost", "http://localhost:666")
                                 .SetIsOriginAllowedToAllowWildcardSubdomains()//允许通配符 如:https://*.example.com
                                 .AllowAnyHeader()
                                 .AllowAnyMethod()
                                 .AllowCredentials();
                        });


            });

        }

Configure配置请求管道

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //注意:1.必须位于UserMvc之前   2.自定义的跨域策略名称,必须和ConfigureServices中的AddPolicy的名称必须一致
            //这里默认启用的配置是:allow_list
            app.UseCors("allow_list");//将 CORS 中间件添加到你的 Web 应用程序管道,以允许跨域请求。 
        }

控制器 Controller 或者 Action 方法上单独设置

这里可以直接在整个控制器上,加上 [EnableCors] 标签,也可以在单独的 Action 上加上标签。

 [Route("api/[controller]/[action]")]
    [ApiController]
    [EnableCors("any")]
    public class DemoController : ControllerBase
    {

        [HttpGet, HttpPost]
        
        public IActionResult GetDemoList()
        {
            List<object> objList = new List<object>();
            objList.Add(new { id = 1, name = "10", money = 200.02D, dTime = DateTime.Now }); 
            return new JsonResult(objList);
        }


        [HttpGet, HttpPost]
        [EnableCors("any")]
        public IActionResult GetDemoStr()
        {
            return new JsonResult("张三说:你好--1!");
        }


    }

 

  1. AllowAnyOrigin 方法,在新的 CORS 中间件已经被阻止使用允许任意 Origin,所以该方法无效。
  2. AllowCredentials 方法,自从 .NET Core 2.2 之后,不允许和AllowAnyOrigin同时调用。
  3. WithOrigins 方法,在 .NET Core 3.1 中有bug,具体原因未知,暂时只能用SetIsOriginAllowed(t=> true)代替,等效.AllowAnyOrigin方法。
  4. 创建项目默认的模板中,app.UseHttpsRedirection()在前面,所以我将app.UseCors()放在它后面,这是导致HTTP 307 Temporary Redirect福报的根本原因之一。
  5. 度娘告诉我,app.UseCors()方法要在app.UseAuthentication()之后,是误人子弟的,其实放在它前面也可以,并且app.UseCors()要在app.UseRouting()之后,app.UseEndpoints()app.UseHttpsRedirection()之前
  6. 使用fetch跨域请求时,要注意controller的action是否有设置除了HttpOptions之外的其它Http Method方法,如果有要加上HttpOptions标记特性,因为fetch跨域请求会先执行OPTIONS预请求。
  7. 使用fetch请求需要JWT认证的接口时,除了在HTTP Headers设置Authorization之外,还需要设置'credentials': 'include'
  8. app.UseXxxxxx方法,引入中间件时,要注意管道(Middleware)注册顺序。

参考:

  • CORS配置:https://docs.microsoft.com/zh-cn/aspnet/core/security/cors?view=aspnetcore-3.1
  • https://www.cnblogs.com/VAllen/p/dotnet-core-3-cors-fetch-response-307-temporary-redirect.html
赞(1)