参考

Docs – Enable Cross-Origin Requests (CORS) in ASP.NET Core

介绍

CORS (Cross-Origin Resource Sharing) 讲的是游览器对跨域服务端发起 HTTP request (Ajax),被游览器禁止读取。

Chrome DevTools 会显示下面这些 error.

早年的解决方法是用 JSONP (用 <script> 发请求,服务端配合返回 JavaScript 并且调用一个全局方法,方法名字是通过 request query parameters 得知的,最后把资料传入方法中)。

现今只需要加上一些 response header 就可以了。

怎样算跨域

1. Domain 不一样

abc.com 和 abc.net

2. Sub domain 不一样

abc.com 和 www.abc.com

3. Scheme 不一样

http 和 https

4. Port 不一样

localhost:4200 和 localhost:61547

基本用法: AddCors & UseCors

和其它 ASP.NET Core module 用法差不多. Service.AddCors, App.UseCors

AddCors (for service)

创建 default policy, by pass all origin (这个适合在开发阶段, 下面会讲 production 阶段应该限制多一点, 不可以 by pass all)

builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(policy =>
{
policy.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});

UseCors (for middleware)

app.UseHttpsRedirection();
app.UseCors();
app.UseAuthorization();

位置很重要哦. 如果 JS 会请求 static file 的话, 那还得放到 app.UseStaticFiles 之上.

Policy Configuration

allow header & method

policy.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();

method 和 header 是 for Preflight request (OPTIONS) 用的. 通常 set any 是 ok 的.

如果 request 有自定义 header,那也需要设置 header。

要限制也是可以

policy.WithMethods("POST", "PUT");

最终会输出

allow origin

origin 最好不要 set any. 很危险. 指定给需要的 origin 就好了.

policy.WithOrigins("https://192.168.1.152:4202");

注意, origin 的结尾不可以有 slash.

allow credentials

如果 request 要携带 cookie 的话需要特别开启

policy.AllowCredentials();

有用 SignalR 的话, 也一定要开启, 参考: Security considerations in ASP.NET Core SignalR

另外 AllowAnyOrigin 和 AllowCredentials 不可以一起使用 (应该是担心安全隐患太大吧)

allow exposed headers

跨域默认只允许 client 访问一些 response header

policy.WithExposedHeaders(“specify-header-name”, "x-custom-header");

通过 WithExposedHeaders 可以配置. 指定某个名字, 或者 by pass all 就用关键字 "x-custom-header"

Policy 管理

上面的例子在管理上是比较简单的. 一个项目一个配置就 ok 了.

但如果遇到比较复杂的项目就需要多一点管理了. 比如多个 Policy. 有些 Controller 允许 CORS 有些不允许.

Multiple Policy

上面我们用的是 AddDefaultPolicy, 这里用的是 AddPolicy 配上 policy name. 可以一直 AddPolicy, 只要确保名字是 unique 就可以了.

builder.Services.AddCors(options =>
{
options.AddPolicy(
name: "MyFirstCorsPolicy",
configurePolicy: policy =>
{
policy.WithOrigins(new[] { "https://192.168.1.152:4202" }).AllowAnyHeader().AllowAnyMethod().AllowCredentials();
}
);
});

[EnableCors] 和 [DisableCors]

可以指定某个 Controller 使用哪一个 CORS Policy, 也可以 disable 某一个 Action

UseCors

不管是 default policy 还是 policy with name, 一定要调用 app.UseCors

app.UseCors();

app.UseCors(), 没有声明 policy name, 表示所有 Controller 使用 default policy (如果有 config default policy 的话, 没有的话 Controller 就得用 attribute 来控制)

app.UseCors("MyFirstCorsPolicy");

with policy name 表示所有 Controller 使用 MyFirstCorsPolicy policy, attribute 可以 override 这个设置.

简而言之就是, 用 attribute 去控制 Controller 和 Action. 用 app.UseCors 做全局控制 (不想全局控制, 就不要 set default policy, 但记得, 无论如何 app.UseCors 依然是需要调用的)

ASP.NET Core – CORS (Cross-Origin Resource Sharing)的更多相关文章

  1. CORS(cross origin resource sharing)

    1.什么是CORS 定义:跨域资源共享. 2.什么是跨域资源共享 允许浏览器可以从当前源服务器通过ajax访问另外一个源服务地址. 3.同源策略 是浏览器的一个安全功能,不同源的客户端脚本在没有明确的 ...

  2. Node.js 【CORS(cross origin resource sharing) on ExpressJS之笔记】

    app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*" ...

  3. CORS (Cross Origin Resources Share) 跨域

    CORS 跨域 1 什么是跨域问题 基于安全考虑,浏览器会限制使用脚本发起任何跨域请求. 所谓的跨域请求,就是与当前页面的 http/ip/port 不一样的请求. 但在实际运用中,跨域获取数据的需求 ...

  4. ASP.NET Core CORS 简单使用

    CORS 全称"跨域资源共享"(Cross-origin resource sharing). 跨域就是不同域之间进行数据访问,比如 a.sample.com 访问 b.sampl ...

  5. 跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享

    在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...

  6. 跨域的另一种解决方案CORS(CrossOrigin Resource Sharing)跨域资源共享

    在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...

  7. (转)跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享

    在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...

  8. Asp.net Core CORS(跨域资源共享)实验

    环境:Asp.Net Core 2 1.问题 最近项目在调用远程UI时遇到点麻,在调用远程CSS文件时无法加载其中的字体文件.远程CSS文件对字体的定义: @font-face { font-fami ...

  9. [转]ASP.NET Core Exception Filters and Resource Filters

    本文转自:https://damienbod.com/2015/09/30/asp-net-5-exception-filters-and-resource-filters/ This article ...

  10. Asp.net Core CORS 跨域

    本文主要介绍在Asp.net Core采用CORS方式解决跨域 关于跨域的原理介绍可参考Asp.net Web API 解决跨域详解 1 在Startup添加允许跨域的策略 services.AddC ...

随机推荐

  1. 网易数帆内核团队:memory cgroup 泄漏问题的分析与解决

    memory cgroup 泄露是 K8s(Kubernetes) 集群中普遍存在的问题,轻则导致节点内存资源紧张,重则导致节点无响应只能重启服务器恢复:大多数的开发人员会采用定期 drop cach ...

  2. 深入解读RabbitMQ工作原理

    RabbitMQ简介 在介绍RabbitMQ之前首先要介绍一下MQ,MQ是什么?MQ全称是Message Queue,可以理解为消息队列的意思. RabbitMQ是一个实现了AMQP(Advanced ...

  3. Django __init__ 方法用于初始化

    使用面向对象的方法来创建一个栈板信息的模型,比如使用 Python 的类来表示栈板信息.以下是一个简单的示例: class Pallet: def __init__(self, number, nam ...

  4. oeasy教您玩转vim - 60- # vim选项

    ​ vim选项 从头开始 这次我们从头开始 从进入vim之前开始 我们可以在终端里面给vim怎么样的参数呢? man vim 这个如果不行的话 要先运行unminimize更新manual 也可以在v ...

  5. ComfyUI进阶:Comfyroll插件 (三)

    前言: 学习ComfyUI是一场持久战,而Comfyroll 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业的图像生成与编辑工具.借助这些节点,用户可以在静态图 ...

  6. golang对遍历目录操作的优化

    一转眼go1.23都快发布了,时间过得真快. 不过今天我们把时间倒流回三年半之前,来关注一个在go1.16引入的关于处理目录时的优化. 对于go1.16的新变化,大家印象最深的可能是io包的大规模重构 ...

  7. 【Binary】XShell6 无法使用的解决办法

    感谢博主的解决方案: https://www.cnblogs.com/pinkpolk/articles/13554445.html 首先需要安装VsCode,并且安装一个[Hex Editor]的插 ...

  8. 【Java】数组强转问题

    问题产生 问题代码: List<String> strs = new LinkedList<String>(); // 中间有添加元素的操作,这里省略... // 这里toAr ...

  9. 【Spring-Security】Re09 CSFR处理

    一.CSRF: CSRF 全称 Cross Site Request Forgery 跨站请求伪造 又称为OneClick Attack & SessionRiding 是非法请求访问,通过伪 ...

  10. "观察者" 网站上不错的对社会问题进行思考的文章--------------- 分享

    原文地址:      https://www.guancha.cn/weichengling 在网上无意中到了下面的文章,对社会热点问题有较为全面的思考,感觉不错,分享一下. ------------ ...