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 HeadersContent-Type:text/html; charset=utf-8Server:Microsoft-IIS/10.0X-Powered-By:ASP.NETRequest HeadersAccept:*/*Accept-Encoding:gzip, deflateAccept-Language:zh-CN,zh;q=0.8Connection:keep-aliveContent-Length:32384Host:b.sample.comOrigin: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[] _origins;    publicAllowCorsAttribute(paramsstring[] origins){_origins = origins;}   

  publicoverridevoidOnActionExecuting(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.Cors

然后配置启用 CORS:

public static class WebApiConfig{   

 publicstaticvoidRegister(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)]publicActionResultIndex(){   

 return View();
}

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

ConfigureServices 中添加配置:

publicvoidConfigureServices(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 中启用配置:

publicvoidConfigure(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")]publicActionResultIndex(){    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 框架引用

参考资料:

  • CORS 简介

  • 跨域资源共享 CORS 详解

  • Enabling Cross-Origin Requests in ASP.NET Web API 2

  • Enabling Cross-Origin Requests (CORS)

原文地址:http://www.cnblogs.com/xishuai/p/aspnet-core-cors.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

ASP.NET Core CORS 简单使用相关推荐

  1. ASP.NET Core 中简单Session登录校验

    ASP.NET Core 中简单Session登录校验:从Session的配置添加.到请求过滤.再到页面操作.推荐相关阅读:ASP.NET 会话状态概述  ASP.NET Cookie 概述  ASP ...

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

    环境 VS 2017 ASP.NET Core 2.2 目标 以相对简单优雅的方式实现用户身份验证和鉴权,解决以下两个问题: 无状态的身份验证服务,使用请求头附加访问令牌,几乎适用于手机.网页.桌面应 ...

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

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

  4. ASP.NET Core 3.0中支持AI的生物识别安全

    本文共两个部分,这是第一部分,其中介绍了 ASP.NET Core 3 中旨在将授权逻辑与基本的用户角色相分离的基于策略的授权模型. 此部分提供了此授权进程的基于生物识别信息(如人脸识别或语音识别)的 ...

  5. 在ASP.NET Core MVC中构建简单 Web Api

    Getting Started 在 ASP.NET Core MVC 框架中,ASP.NET 团队为我们提供了一整套的用于构建一个 Web 中的各种部分所需的套件,那么有些时候我们只需要做一个简单的 ...

  6. 一劳永逸:域名支持通配符,ASP.NET Core中配置CORS

    ASP.NET Core 内置了对 CORS 的支持,使用很简单,只需先在 Startup 的 ConfigureServices() 中添加 CORS 策略: public void Configu ...

  7. ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 异常和错误处理 上一章节中,我们学习了 ASP.NET Cor ...

  8. asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程...

    最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...

  9. ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core macOS 环境配置 - ASP.NET Core 基础 ...

最新文章

  1. 【转】NGUI研究院之三种方式监听NGUI的事件方法(七)
  2. Office 365启用多重身份验证
  3. 借助 IIS 管理器 -- 用手机测试HTML页面
  4. pacman安装ubuntu_为什么tensorflow用户宁可ubuntu繁琐步骤搭建环境,也不用一条命令直达的manjaro?...
  5. RedHat 5.4下构建postfix全功能电子邮(七)-extmail extman平台-(下集)
  6. 物联网商机迸发 LPWAN芯片现身 本文转自d1net(转载)
  7. 对话MathWorks:解读MATLAB技术生态圈与未来趋势
  8. Python默认参数
  9. DTCoreText
  10. XenCenter导出虚拟机
  11. 从yesno模型入门kaldi语音识别
  12. 计算机音量程序是哪个键,计算机键盘上的哪个键是音量
  13. 「JCVI教程」使用JCVI进行基因组共线性分析(上)
  14. [转载]千古真人张三丰
  15. 2O2021年贵州高考成绩查询时间,贵州高考成绩一般公布时间 2021贵州高考成绩什么时候公布...
  16. 配置表单和报表以使用HTTP Server(OHS)
  17. afx是什么意思呀,什么时候要include呢,这个头文件的作用是??
  18. java怎么实现分享链接_分享Java
  19. [转帖]深度解析区块链POW和POS的区别
  20. ajax机制 缓存,浅谈Ajax的缓存机制

热门文章

  1. 模块XX.dll已加载,但对DllRegisterServer的调用失败
  2. 做操作系统的公司,为什么不能把系统安全做好?
  3. 笔记本内置扬声器三强PK
  4. SQL Server的数据导入MySQL数据库方法简介
  5. .NET6之MiniAPI(三十):结束篇(附链接)
  6. 龙芯上市是自主路线被广泛认可的风向标
  7. 愚蠢的领导才会用程序员祭天!!
  8. C sharp实例:华盾武器门数据接收和解析
  9. 常用加解密工具集合|视频图片加解密方案
  10. ASP.NET Core 基于角色的 JWT 令牌