专栏首页Vincent-yuanasp.net core 系列之允许跨域访问-1(Enable Cross-Origin Requests:CORS)

asp.net core 系列之允许跨域访问-1(Enable Cross-Origin Requests:CORS)

接上篇的允许跨域

4.CORS 策略(Policy)的选项

这里讲解Policy可以设置的选项:

  • 设置允许的访问源
  • 设置允许的HTTP methods
  • 设置允许的请求头(request header)
  • 设置暴露的响应头(response header)
  • 跨不同源请求的证书(Credentials)
  • 设置过期时间

AddPolicy 在StartUp.ConfigureServices方法中调用;对于一些选项,先阅读一下,CORS是怎么工作的,可能会有帮助

设置允许的源(Origins)

AllowAnyOrigin :允许CORS请求从任何源来访问,这是不安全的

注意:指定AllowAnyOrigin 和AllowCredentials 是一种不安全的配置,可能会导致 跨站请求伪造(cross-site request forgery:CSRF)。

当应用使用这两个配置时,CORS服务返回一个无效的CORS响应。

SetIsOriginAllowedToAllowWildcardSubdomains:设置策略的 IsOriginAllowed 属性,使可以匹配一个配置的带通配符的域名

options.AddPolicy("AllowSubdomain",
    builder =>
    {
        builder.SetIsOriginAllowedToAllowWildcardSubdomains();
    });

设置允许的HTTP methods

AllowAnyMethod:

  • 允许任何HTTP method
  • 影响预检请求(preflight request)和 Access-Control-Allow-Methods header

设置允许的请求头(request header)

要允许一个CORS请求中指定的请求头,可以使用 WithHeaders 来指定。

options.AddPolicy("AllowHeaders",
    builder =>
    {
        builder.WithOrigins("http://example.com")
               .WithHeaders(HeaderNames.ContentType, "x-custom-header");
    });

允许所有的请求头

options.AddPolicy("AllowAllHeaders",
    builder =>
    {
        builder.WithOrigins("http://example.com")
               .AllowAnyHeader();
    });

一个CORS中间件策略用 WithHeaders匹配特定的头,而请求中的头部(记录在Access-Control-Request-Headers)需要精确匹配WithHeader中的头部才可以跨域。

例如:

应用中策略

app.UseCors(policy => policy.WithHeaders(HeaderNames.CacheControl));

请求中的部分数据:

Access-Control-Request-Headers: Cache-Control, Content-Language

CORS中间件会拒绝这个请求,因为Content-Language(HeaderNames.ContentLanguage)没有在WithHeaders中列出来;

设置暴露的响应头

默认情况下,浏览器不会暴露所有的响应头给应用。

默认可用的响应头是:

  • Cache-Control
  • Content-Language
  • Content-Type
  • Expires
  • Last-Modified
  • Pragma

如果想让其他的头部对应用可用,可以调用 WithExposedHeaders:

options.AddPolicy("ExposeResponseHeaders",
    builder =>
    {
        builder.WithOrigins("http://example.com")
               .WithExposedHeaders("x-custom-header");
    });

跨源(cross-origin)请求中的证书(Credentials)

默认情况下,浏览器不允许在跨域请求中发送证书。

证书中包含缓存(cookies)和HTTP验证协议(HTTP authentication schemes)。

要再跨域中发送证书,客户端(浏览器)必须设置 XMLHttpRequest.withCredentials 为 true。

直接使用 XMLHttpRequest

var xhr = new XMLHttpRequest();
xhr.open('get', 'https://www.example.com/api/test');
xhr.withCredentials = true;

使用JQuery

$.ajax({
  type: 'get',
  url: 'https://www.example.com/api/test',
  xhrFields: {
    withCredentials: true
  }
});

使用 Fetch API

fetch('https://www.example.com/api/test', {
    credentials: 'include'
});

服务端也需要允许证书。使用AllowCredentials

options.AddPolicy("AllowCredentials",
    builder =>
    {
        builder.WithOrigins("http://example.com")
               .AllowCredentials();
    });

包含 Access-Control-Allow-Credentials 头部的HTTP 响应(HTTP Response) 将告诉浏览器:服务器允许跨域请求的证书;

如果浏览器发送证书,但是响应没有包含一个有效的 Access-Control-Allow-Credentials 头部 , 浏览器不会暴露响应给应用,跨域失败;

允许跨域证书是一个安全风险。

在跨域中,如果 Access-Control-Allow-Credentials 头部出现了,则意味着 设置为所有的源 (setting origin to " * ")会失效。

参考网址

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2#cors-policy-options

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java之spring之对象的创建

    Vincent-yuan
  • java之struts2之文件下载

    注意:直接通过超链接下载文件,如果浏览器能够读取文件,浏览器会直接读取,而不会下载到本地。并且有安全问题。所以,可以通过action来实现下载。

    Vincent-yuan
  • java之hibernate之hibernate查询

    1.数据库操作中最重要的是查询,Hibernate提供了多种查询方式来帮助程序员快速实现查询功能。

    Vincent-yuan
  • 深度学习应用大盘点

    当首次介绍深度学习时,我们认为它是一个要比机器学习更好的分类器。或者,我们亦理解成大脑神经计算。 第一种理解大大低估了深度学习构建应用的种类,而后者又高估了它的...

    CSDN技术头条
  • Java并发编程系列:wait/notify机制

    如果一个线程从头到尾执行完也不和别的线程打交道的话,那就不会有各种安全性问题了。但是协作越来越成为社会发展的大势,一个大任务拆成若干个小任务之后,各个小任务之间...

    南风
  • win7系统盘瘦身四大招:

    第一招:关闭休眠 同XP及Vista系统类似,在Win7中休眠文件也要占用很大的空间。 而一般情况下休眠功能又很少用到,所以如果你的硬盘空间并不“富裕”,那么...

    Enjoy233
  • 機器人仿真與控制學習小結

    最早接觸的仿真軟件應該是Matlab,10多年前用過的版本是6.5和7.0,那是Matlab的安裝包還不到1GB。用作控制理論的仿真工具,和Matlab6.5同...

    zhangrelay
  • Markdown:插入数学公式

    keloli
  • Linux漏洞分析入门笔记-CVE_2018_6323_整型溢出

    在计算机中,整数分为无符号整数以及有符号整数两种。其中有符号整数会在最高位用0表示正数,用1表示负数,而无符号整数则没有这种限制。另外,我们常见的整数类型有8位...

    我是小三
  • 你真的了解 Java volatile 关键字吗?

    happens-before 规则中有一条是 volatile 变量规则:对一个 volatile 域的写,happens-before 于任意后续对这个 vo...

    字节流动

扫码关注云+社区

领取腾讯云代金券