1.NET Core Web Api跨域问题

时间:2022-06-11 08:18:00

官方说明 具体实践

需要引入 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,且末尾千万不要加反斜杠。":6395"