.Net Core 处理跨域问题

一、什么是跨域(源)


跨域指的是从一个域名下去请求另外一个不同的域名下的资源。

说明:跨域和跨源可以看作相同,只是用词不一样

二、为什么会有跨域(源)这个问题


原因:浏览器的同源策略导致了跨域(源)
同源策略说明:https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy

举例:http://www.a.com:8080/index.html
当协议(http、https)、域名(www.a.com)、端口号(8080)中任意一个不相同时,都算作不同域。
当浏览器页面在执行一个脚本时会检查访问的资源是否同源,如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。

URLURL2  是否同域(源) 原因
http://www.a.com/index.htmlhttp://www.a.com/index.html协议、域名、端口号都相同
http://www.a.com/index.htmlhttp://www.a.com/login.html协议、域名、端口号都相同,说明index和login可以不同,也是同域
http://www.a.com/index.html https://www.a.com/index.html不同协议 ( https和http )
http://www.a.com:/index.htmlhttp://www.a.com:81/index.html不同端口 ( http://www.a.com:/index.html  默认80端口号)
http://www.a.com/index.html http://www.b.com/index.html不同域名
http://www.c.a.com/index.html http://www.b.a.com/index.html不同域名,二级域名不同
http://localhost:8081/index.htmlhttp://127.0.0.1:8081/index.html 虽然localhost等同于 127.0.0.1 但是也是非同源的

 

 

 

 

 

 

 

 

 

 


同源策略限制内容有:
Cookie、LocalStorage、IndexedDB 等存储性内容
DOM 节点
AJAX 请求不能发送

但是有些标签是允许跨域加载资源:<img src=XXX> 2.<link href=XXX> 3.<script src=XXX>  3.<iframe src=XXX>
对于像 img、iframe、script 等标签的 src 属性是特例,它们是可以直接跨域访问资源的。


三、处理跨域的方法


    跨域资源共享(CORS) :https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
1.说明:
(1)跨域资源共享标准有了一组 HTTP 头部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。
(2)对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求,从而获知服务端是否允许该跨域请求。
服务器确认允许之后,才发起实际的 HTTP 请求。
(3)在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。

跨域请求可分为简单请求(只请求一次)和预检请求(请求两次,第一次:使用OPTIONS方法发起一个预检请求,第二次:当预检请求允许该跨域请求,再发起实际的HTTP请求)

四:NET Core 配置跨域

1.ConfigureServices中配置

//方法一:配置跨域处理,允许所有来源AllowAnyOrigin:
services.AddCors(options =>options.AddPolicy("自定义的跨域策略名称",policy => policy.AllowAnyOrigin()));

//方法二:允许一个或多个具体来源:
services.AddCors(options =>
{
    //注意:自定义的跨域策略名称,必须和Configure中的UseCors的名称必须一致
    options.AddPolicy("自定义的跨域策略名称", policy =>
    {
        //1.允许跨域的来源,多个跨域来源时可以使用`,` 分割, policy.WithOrigins("http://192.168.8.236:4444", "http://192.168.8.236:4445") 
        //2.多个跨域来源时可以使用string[]
        string Origins = "http://192.168.8.236:4444,http://192.168.8.236:4445";
        policy.WithOrigins(Origins.Split(','))
                .AllowAnyHeader()
                .AllowAnyMethod()
                .AllowCredentials();
    });
});

1.Configure中配置

//注意:1.必须位于UserMvc之前   2.自定义的跨域策略名称,必须和ConfigureServices中的AddPolicy的名称必须一致
app.UseCors("自定义的跨域策略名称"); 

posted @ 2019-09-19 16:39  预立科技  阅读(69)  评论(0编辑  收藏  举报