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 ...
随机推荐
- [oeasy]python0021_宝剑镶宝石_爱之石中剑_批量替换_特殊字符_特殊颜色
继续运行 回忆上次内容 上次 运行了 game.py 分析了 game.py 也大致读懂了 game.py 添加图片注释,不超过 140 字(可选) 这个 程序 可以进一步 进行修改吗 ...
- [oeasy]python0131_[趣味拓展]各种符号_汉语拼音符号_中文全角英文字母_中文全角标点
各种符号 回忆上次内容 中文字符可以有各种分类方法 声母 拼音检字法 韵母 合辙押韵的分类 偏旁部首 实际上unicode的排序方法 添加图片注释,不超过 140 字(可选) ...
- Linux 手工释放Linux Cache Memory
手工释放Linux Cache Memory 为了加速操作和减少磁盘I/O,内核通常会尽可能多地缓存内存,这部分内存就是Cache Memory(缓存内存).根据设计,包含缓存数据的页面可以按需重新用 ...
- Vue 修改网页标题和图标
Vue 修改网页标题和图标 by:授客 QQ:1033553122 开发环境 Win 10 Vue 2.5.2 需求描述 如下,想更改网页的标题和图标 解决方法 编辑项目根目录下的in ...
- ThinkPHP6支持金仓数据库(Kingbase)解决无法使用模型查询问题
参考了很多前人的文章,最后只支持Db::query原生查询,不支持thinkphp数据模型方法,这在实际项目中是很难接受的,特分享出解决方案. 先按照流程配置如下: 1.准备工作 首先确认PHP支持金 ...
- 【H5】08 图片
摘自: https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Multimedia_and_embedding 在这份教程中,到目前为止我们已经看到了 ...
- 【PC-Game】世嘉拉力:进化
SegaRally:Revo游戏本体资源: 游侠网115盘 + 详细介绍 https://game.ali213.net/forum.php?mod=viewthread&tid=409661 ...
- 日本联合研究团队发布 Fugaku-LLM——证明大型纯 CPU 超算也可用于大模型训练
相关: https://mbd.baidu.com/newspage/data/landingsuper?context={"nid"%3A"news_101396655 ...
- conda报错、anconda报错:requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
anconda报错,报错信息: requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 不能使用c ...
- mindspore-gpu-2.2.0版本学习笔记
docker镜像拉取: docker pull swr.cn-south-1.myhuaweicloud.com/mindspore/mindspore-gpu-cuda11.6:2.2.0 使用 ...