官方说明
具体实践
- 需要引入 Microsoft.AspNetCore.Mvc.Cors 包
- Cors配置
- Startup.cs文件ConfigureServices方法中,将Cors服务放到容器中
- services.AddCors(options); 传一个options,指定名字并配置它,这个时候跨域并没有起作用。
- options可以对Origin、Header、Method进行指定,这些配置方式是fluent api。
- AllowAnyOrigin()表示允许任意的源、请求头、请求方式。
- 以配置AllowAnyOrigin()为例,响应头里会有Access-Control-Allow-Origin:*
- WithOrigins(string[] origins)入参为放行的源、请求头、请求方式。
- AllowCredentials(),Response Header里会有Access-Control-Allow-Credentials:true
- Cors生效(三选一,推荐第一种)
- Startup.cs文件Config方法,给全局加上允许跨域,则所有的配置里允许的资源(多为controller中的接口)都可以跨域访问。
- app.UseCors("CorsPolicy"); //这里“CorsPolicy”是自定义的名字,在options中设定。
- Startup.cs文件ConfigureServices方法,给全局加上允许跨域,效果同上。
- services.Configure(options =>
options.Filters.Add(new CorsAuthorizationFilterFactory("CorsPolicy"))
); //“CorsPolicy”同上。
- 在指定controller或方法上标注[EnableCors("CorsPolicy")],允许这些资源跨域访问。//“CorsPolicy”同上上。
- 注意事项
- 由于前端通常都会将withCredential设置为true,所以配置时必须AllowCredentials()。
- XMLHttpRequest的withCredentials标志设置为true,则cookies可以随着请求发送。这时,如果服务器端的响应中,如果没有返回Access-Control-Allow-Credentials: true的响应头,那么浏览器将不会把响应结果传递给发出请求的脚本程序,以保证信息的安全。
- Access-Control-Allow-Origin这个头不允许使用通配符,即必须指定允许的域,用WithOrigins(string[] origins)方法,origins建议在appsettings.json文件配置。
- 如果一个目标域设置成了允许任意域的跨域请求,这个请求又带cookie的话,则请求不合法,浏览器会屏蔽掉返回的结果。(即如果需要实现带cookie的跨域请求,需要明确的配置允许来源的域,使用任意域的配置是不合法的。)这是cors模型最后一道防线。假如没有这个限制的话,那么javascript就可以获取返回数据中的csrf token,以及各种敏感数据。这个限制极大的降低了cors的风险。
- 在appsettings.json中配置origins时,务必指定scheme、domain、subdomain、port,且末尾千万不要加反斜杠。"http://localhost:6395"
05-26 15:35