CORS 全称"跨域资源共享"(Cross-origin resource sharing)。

跨域就是不同域之间进行数据访问,比如 a.sample.com 访问 b.sample.com 中的数据,我们如果不做任何处理的话,就会出现下面的错误:

XMLHttpRequest cannot load b.sample.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'a.sample.com' is therefore not allowed access. The response had HTTP status code 404.

请求和响应信息:

Response Headers
Content-Type:text/html; charset=utf-8
Server:Microsoft-IIS/10.0
X-Powered-By:ASP.NET Request Headers
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Content-Length:32384
Host:b.sample.com
Origin:a.sample.com

当请求发起后,Host 会获取 Origin,然后进行判断是否同意这个请求,判断的标准就是 Access-Control-Allow-Origin,如果 Host 服务器指定了 Origin 的配置,那么在响应头就会有:

Access-Control-Allow-Origin:a.sample.com

相关的 Access-Control-*:

  • Access-Control-Allow-Origin:指定请求头中 Origin 是否被访问,如果值为 *,则表示可以让任何 Origin 访问。
  • Access-Control-Request-Method:允许的 HTTP 请求方法,常用 Get、Post、Put 等,如果值为 *,则表示允许所有的 HTTP 请求方法访问。
  • Access-Control-Expose-Headers:客户端默认可以从服务器获取响应头中的 Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma 字段信息,如果需要额外获取其它 header 字段信息,则需要在服务端进行配置。

    Access-Control-Request-Headers:允许客户端向服务器发送的额外请求头信息,和上面的 Access-Control-Expose-Headers 比较相似,但方向是相反的,一般会用在添加自定义 header 的时候,比如 X-Param 等等。
  • Access-Control-Allow-Credentials:如果值为 true,则表示服务端可以接受客户端发送的 Cookie 信息,但客户端请求中需要同时设置withCredentials = true;
  • Access-Control-Max-Age:请求检查的缓存时间,即在一段时间内,客户端向服务器发送请求,不需要再进行检查 Origin 的配置,而是直接进行请求访问,当然服务器更改配置后除外。

以上是 CORS 的基本相关信息,我们在 ASP.NET MVC 应用程序开发中,需要手动配置 CORS:

public class AllowCorsAttribute : ActionFilterAttribute
{
private string[] _domains; public AllowCorsAttribute(params string[] domains)
{
_domains = domains;
} public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var context = filterContext.RequestContext.HttpContext;
if (context.Request.UrlReferrer != null)
{
var host = context.Request.UrlReferrer?.Host;
if (host != null && _domains.Contains(host))
{
context.Response.AddHeader("Access-Control-Allow-Origin", $"http://{host}");
}
}
else
{
context.Response.AddHeader("Access-Control-Allow-Origin", "*");
}
context.Response.AddHeader("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS, POST, PUT");
context.Response.AddHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
base.OnActionExecuting(filterContext);
}
}

上面代码就是截获每次 Action 请求,手动向请求上下文中增加相应头的配置,以达到 CORS 的目的,Action 配置:

[AllowCors("a.sample.com", "c.sample.com")]
public ActionResult Index()
{
return View();
}

而在 ASP.NET WebAPI 项目中配置 CORS,就不需要上面那么复杂了,我们只需要安装:

Install-Package Microsoft.AspNet.WebApi.Cors

然后配置启用 CORS:

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.EnableCors(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}

最后在对应的 Action 上面添加 CORS 配置就行了:

[EnableCors(origins: "http://a.sample.com", headers: "*", methods: "get,post", SupportsCredentials = true)]
public ActionResult Index()
{
return View();
}

在 ASP.NET Core 的 CORS 配置和上面差不多,配置方法:

ConfigureServices 中添加配置:

public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc(); services.AddCors(options => options.AddPolicy("CorsSample",
p => p.WithOrigins("http://a.example.com", "http://c.example.com").AllowAnyMethod().AllowAnyHeader()));
}

Configure 中启用配置:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseStaticFiles(); app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
}); app.UseCors("CorsSample");
}

Action 启用对应的 CORS,不启用使用[DisableCors]

[EnableCors("CorsSample")]
public ActionResult Index()
{
return View();
}

当然 CORS 在 ASP.NET Core 的使用不仅于此,你也可以进行自定义,具体查看最后的参考资料。

跨域除了 CORS,还有其它的解决方式:

  • JSONP:通过在文档中嵌入一个<script>标记来从另一个域中返回数据,所以只支持 GET 请求,但使用比较简单,资料:ASP.NET Web API 配置 JSONP
  • document.domain:JS 配置代码document.domain = ‘sample.com’;,设置完之后,同域之间就可以 JS 互相访问了,但存在一些隐患,比如一个站点被 JS 注入了,那么就会牵扯到其它站点,资料:ASP.NET 页面禁止被 iframe 框架引用

参考资料:

ASP.NET Core CORS 简单使用的更多相关文章

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

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

  2. ASP Net Core – CORS 预检请求

    CORS(跨源资源共享)是一种机制,它允许同一个来源运行的Web应用程序从在另一个来源运行的服务器访问资源.同源策略是一种非常严格的措施,因为它只允许与服务器起源于同一源的应用程序访问其资源.很多时候 ...

  3. C# ASP.NET MVC/WebApi 或者 ASP.NET CORE 最简单高效的跨域设置

    概述 前面写了一篇:<C# ASP.NET WebApi 跨域设置>的文章,主要针对 ASP.NET WebApi 项目. 今天遇到 ASP.NET MVC 项目也需要设置跨域,否则浏览器 ...

  4. ASP.NET Core 项目简单实现身份验证及鉴权

    ASP.NET Core 身份验证及鉴权 目录 项目准备 身份验证 定义基本类型和接口 编写验证处理器 实现用户身份验证 权限鉴定 思路 编写过滤器类及相关接口 实现属性注入 实现用户权限鉴定 测试 ...

  5. Asp.net Core CORS 跨域

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

  6. 使用SignalR ASP.NET Core来简单实现一个后台实时推送数据给Echarts展示图表的功能

    什么是 SignalR ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功能添加到应用程序的功能. 实时 web 功能使服务器端代码可以立 ...

  7. Asp.Net Core中简单使用日志组件log4net

    本文将简单介绍在.NET 6中使用log4net的方法,具体见下文范例. 1.首先新建一个ASP.NET Core空项目 2.通过Nuget包管理器安装下面两个包 log4net Microsoft. ...

  8. 基于Asp.Net Core的简单社区项目源代码开源

    2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0+EF CORE 3.0开发 使用vs2019 +sqlserver 2017(数据库脚本最低支持sql server 20 ...

  9. 部署ASP.NET Core最简单的办法,使用IIS部署ASP.NET Core应用

    本文迁移自Panda666原博客,原发布时间:2021年3月28日.写原文的时候.NET的最新版本是5.0,现在7的preview出来了,时间真快啊.抽空再写个在Windows Server Core ...

随机推荐

  1. alias导致virtualenv异常的分析和解法

    title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...

  2. 在SQL2008查找某数据库中的列是否存在某个值

    在SQL2008查找某数据库中的列是否存在某个值 --SQL2008查找某数据库中的列是否存在某个值 create proc spFind_Column_In_DB ( @type int,--类型: ...

  3. 使用蓝灯后,IE浏览器以及内置IE浏览器的程序不能使用的解决方案

    使用完蓝灯后,每次使用IE浏览器都不能正常使用,于是有了下面的这个方案 1.通过Win+R 打开注册表编辑器(regedit) 进入目录 HKEY_CURRENT_USER \ Software \ ...

  4. VS2015墙内创建ionic2

    开始学习ionic2,试验各种方法,感觉以下是紧跟rc版本的最佳方案 STEP1 设置cnpm npm install -g cnpm --registry=https://registry.npm. ...

  5. 萌新笔记——linux下查看内存的使用情况

    windows上有各种软件可以进行"一键加速"之类的操作,释放掉一些内存(虽然我暂时不知道是怎么办到的,有待后续学习).而任务管理器也可以很方便地查看各进程使用的内存情况,如下图: ...

  6. openfire的组件(Component)开发

    在之前的文章<Openfire阶段实践总结>中提到过一种openfire的扩展模式Compoent.本文将主要探讨对这种模式的应用与开发方法. 内部与外部组件介绍 在openfire中的许 ...

  7. Ubuntu14.04配置Mono+Jexus

    总所周知,ASP.NET是微软公司的一项技术,是一个网站服务端开发的一种技术,它可以在通过HTTP请求文档时再在Web服务器上动态创建它们,就是所谓动态网站开发,它依赖运行于 IIS 之中的程序 .但 ...

  8. ABP理论之时间

    返回总目录 本篇目录 介绍 Clock 时区 绑定器和转换器 介绍 虽然有些应用针对的是一个特定的时区,但是也有一些应用针对多个不同的时区.为了满足这些需求,ABP为datetime操作提供了通用的基 ...

  9. CSS垂直居中总结

    工作中遇到垂直居中问题,特此总结了一下几种方式与大家分享.本文讨论的垂直居中仅支持IE8+ 1.使用绝对定位垂直居中 <div class="container"> & ...

  10. Spring cookie 实战

    测试环境搭建 使用Springboot构建web server, 在测试方法中打印接收的cookie. @RestController @RequestMapping("/register/ ...