ASP.NET Core – CORS (Cross-Origin Resource Sharing)
参考
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)的更多相关文章
- CORS(cross origin resource sharing)
1.什么是CORS 定义:跨域资源共享. 2.什么是跨域资源共享 允许浏览器可以从当前源服务器通过ajax访问另外一个源服务地址. 3.同源策略 是浏览器的一个安全功能,不同源的客户端脚本在没有明确的 ...
- Node.js 【CORS(cross origin resource sharing) on ExpressJS之笔记】
app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*" ...
- CORS (Cross Origin Resources Share) 跨域
CORS 跨域 1 什么是跨域问题 基于安全考虑,浏览器会限制使用脚本发起任何跨域请求. 所谓的跨域请求,就是与当前页面的 http/ip/port 不一样的请求. 但在实际运用中,跨域获取数据的需求 ...
- ASP.NET Core CORS 简单使用
CORS 全称"跨域资源共享"(Cross-origin resource sharing). 跨域就是不同域之间进行数据访问,比如 a.sample.com 访问 b.sampl ...
- 跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享
在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...
- 跨域的另一种解决方案CORS(CrossOrigin Resource Sharing)跨域资源共享
在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...
- (转)跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享
在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...
- Asp.net Core CORS(跨域资源共享)实验
环境:Asp.Net Core 2 1.问题 最近项目在调用远程UI时遇到点麻,在调用远程CSS文件时无法加载其中的字体文件.远程CSS文件对字体的定义: @font-face { font-fami ...
- [转]ASP.NET Core Exception Filters and Resource Filters
本文转自:https://damienbod.com/2015/09/30/asp-net-5-exception-filters-and-resource-filters/ This article ...
- Asp.net Core CORS 跨域
本文主要介绍在Asp.net Core采用CORS方式解决跨域 关于跨域的原理介绍可参考Asp.net Web API 解决跨域详解 1 在Startup添加允许跨域的策略 services.AddC ...
随机推荐
- 基于 Impala 的高性能数仓实践之物化视图服务
本文将主要介绍 NDH Impala 的物化视图实现. 接上篇,前两篇分别讲了执行引擎和虚拟数仓,它们是让一个 SQL 又快又好地执行的关键.但如果某些 SQL 过于复杂,比如多张大表进行 Join ...
- Springboot层级关系以及作用
entity entity是实体层,与model,pojo相似,是存放实体的类,类中定义了多个类属性,并且与数据库表的字段保持一致,一张表对应了一个entity类.主要用于定于与数据库对象对应的属性, ...
- vue codemirro 文件对比 sql编辑器
效果图: 安装及引用同上一篇文章,请移步:https://www.cnblogs.com/Lu-Lu/p/16265815.html HTML: <el-dialog class="d ...
- Spectre.Console.Cli注入服务的几种姿势
Spectre.Console大家可能都不陌生,写控制台程序美化还是不错的,支持着色,表格,图标等相当nice,如果对这个库不熟悉我强烈推荐你了解一下,对于写一些CLI小工具还是相当方便的, 本文主要 ...
- Linux中&&、&、|、||等特殊符号
&& 和 & & 表示任务后台执行,与nohup命令功能差不多. # 运行jar包,并且置于后台执行,执行的日志重定向到当前默认的log.txt文件中 [root@lo ...
- 搭建lnmp环境-redis(第四步)
1.下载epel仓库 (前面安装过了) yum install epel-release -y 2.下载redis数据库 yum install redis -y 3.启动redis服务 system ...
- 【Vue】el-table 简易表格可筛选列
需求实现: 代码逻辑: 按钮控件: <el-popover placement="top-start"> <el-checkbox-group v-model=& ...
- 【Tutorial C】01 概述
历史 History 欢迎来到C语言的世界!C语言是一种强大的专业化编程语言,深受业余和专业编程人员的欢迎. 在学习之前先让我们了解和认识它! C语言的原型是A语言(ALGOL 60语言). 1963 ...
- 存算一体的芯片架构是不是在胡说八道 —— 大模型解决不了英伟达的难题,AI新范式必将出现:专访安克创新CEO阳萌
地址: https://www.youtube.com/watch?v=kMBjzxKYWw4 PS. 个人估计,如果不改变现有的计算理论,那么就只是在冯诺依曼结构基础上谈存算一体结构,我看这是在搞噱 ...
- 为什么要使用工业仿真软件? —— CAE(Computer Aided Engineering)工程设计中的计算机辅助工程
CAE技术: 引自: https://baike.baidu.com/item/CAE技术/18884456?fr=ge_ala 引自: https://www.mscsoftware.com.cn/ ...