本文翻译整理自:https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1

一 、Cross-Origin Requests (CORS) 跨域请求

什么是跨域请求?

浏览器的安全特性阻止一个网页向不同于提供当前网页服务器的域发送请求。这种限制叫做同域策略(same-orign policy)。同域策略阻止恶意网站从另一个网站读取敏感数据。但是有些时候,你可能需要允许其他网站跨域请求到你的应用程序。

那么怎么才能实现跨域请求呢?W3C标准中为我们提供了解决方法:跨域资源共享。

Cross Origin Resource Sharing(CORS): 跨域资源共享

  • 是一个W3C标准,允许一个服务器放宽同域策略
  • 不是安全特性,Cross Origin Resource Sharing(CORS)并没有是网站更加安全,而是放宽了安全特性。允许 CORS 的 API 并不更加安全
  • 允许一个服务器显式的指定允许跨域请求的域而拒绝其他的域
  • 比之前解决跨域请求的技术更加安全和灵活,比如JSONP

二 、什么是同域

拥有完全相同协议、域名和端口的两个URL才算是同域

比如下面两个URL就是同域

  • https://example.com/foo.html
  • https://example.com/bar.html

下面这些和上面的两个就属于不同域

  • https://example.net – 域不同
  • https://www.example.com/foo.html – 子域不同
  • http://example.com/foo.html – 协议不同
  • https://example.com:9000/foo.html – 端口不同

三 、如何在ASP.NET Core中启用跨域请求

在ASP.NET Core中配置跨域请求有以下几种方法:

  1. 使用命名策略和中间件
    使用CORS中间件处理跨域请求,代码如下:

    public class Startup
    {
    public Startup(IConfiguration configuration)
    {
    Configuration = configuration;
    } readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins"; public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
    {
    // 配置跨域请求
    services.AddCors(options =>
    {
    options.AddPolicy(MyAllowSpecificOrigins,
    builder =>
    {
    // 在这里配置允许跨域的域
    // 比如我们在局域网中开发,测试服务器在另一台电脑,我们的开发电脑的IP是 http://192.168.0.1 我们就可以把开发的IP添加进来,这样在开发调试时就可以做到跨域请求
    builder.WithOrigins("http://192.168.0.1",
    "http://www.example.com");
    });
    }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    } public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
    if (env.IsDevelopment())
    {
    app.UseDeveloperExceptionPage();
    }
    else
    {
    app.UseHsts();
    } // 启用跨域请求
    app.UseCors(MyAllowSpecificOrigins); app.UseHttpsRedirection();
    app.UseMvc();
    }
    }

    我们分别在 ConfigureServices 和 Configure 中配置和启用跨域请求
    配置的时候,WithOrigins 返回一个 CorsPolicyBuilder 对象,可以链式调用方法,比如 AllowAnyHeader, AllowAnyOrigin 具体作用可以查看文档;

    注意:参数URL不能以斜杠/结尾,如果URL以 / 结尾的话,在方法中对比 URL 就会返回 false,也就是会认为是不同的 URL

    UseCors 通过中间件对所有 endpoints 应用 CORS 策略
    注意:UseCors 的调用必须在 UseRouting 和 UseEndpoints 之间,错误的调用顺序将会引起错误

  2. 使用 Endpoint 路由启用跨域
    使用Endpoint 路由,CORS 可以使用 RequireCors 启用,代码如下:
    app.UseEndpoints(endpoints =>
    {
    endpoints.MapGet("/echo", async context => context.Response.WriteAsync("echo"))
    .RequireCors("policy-name");
    });

    同样的,可以把 CORS 应用到所有控制器上:

    app.UseEndpoints(endpoints =>
    {
    endpoints.MapControllers().RequireCors("policy-name");
    });
  3. 使用特性启用 CORS
    [EnableCors] 特性提供了全局应用 CORS 的途径。[EnableCors] 对选定的终点启用 CORS,而不是应用到全部的终点。
    使用 [EnableCors] 指定默认的策略,[EnableCors("{Policy String}")] 指定特定的策略。
    [EnableCors] 可以应用到以下几个地方:
    - Razor Page PageModel
    - Controller
    - Controller action method
    使用 [EnableCors] 特性,你可以应用不同的策略到 controller/page-model/action。当 [EnableCors] 特性应用到 controller/page-model/action 上,并且 CORS 在中间件中也启用了,那么两者都会起作用。我们的建议是不要叠加策略。使用 [EnableCors] 特性或者使用中间件,不要在同一个应用程序中同时使用。
    [Route("api/[controller]")]
    [ApiController]
    public class WidgetController : ControllerBase
    {
       // 指定策略
    [EnableCors("AnotherPolicy")]
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
    return new string[] { "green widget", "red widget" };
    } [EnableCors] // 默认策略
    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
    switch (id)
    {
    case :
    return "green widget";
    case :
    return "red widget";
    default:
    return NotFound();
    }
    }
    }

    设置默认策略:

            services.AddCors(options =>
    {
    options.AddDefaultPolicy(
    builder =>
    { builder.WithOrigins("http://example.com",
    "http://www.contoso.com");
    }); options.AddPolicy("AnotherPolicy",
    builder =>
    {
    builder.WithOrigins("http://www.contoso.com")
    .AllowAnyHeader()
    .AllowAnyMethod();
    }); });

    关闭CORS
    [DisableCors] 特性可以应用到 controller/page-model/action 用来关闭CORS

ASP.NET Core 启用跨域请求的更多相关文章

  1. ASP.NET Core-Docs:在 ASP.NET Core 中启用跨域请求(CORS)

    ylbtech-ASP.NET Core-Docs:在 ASP.NET Core 中启用跨域请求(CORS) 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 1. ...

  2. 在 ASP.NET Core 中启用跨域请求(CORS)

    本文介绍如何在 ASP.NET Core 的应用程序中启用 CORS. 浏览器安全可以防止网页向其他域发送请求,而不是为网页提供服务. 此限制称为相同源策略. 同一源策略可防止恶意站点读取另一个站点中 ...

  3. ASP.NET WebApi+Vue前后端分离之允许启用跨域请求

    前言: 这段时间接手了一个新需求,将一个ASP.NET MVC项目改成前后端分离项目.前端使用Vue,后端则是使用ASP.NET WebApi.在搭建完成前后端框架后,进行接口测试时发现了一个前后端分 ...

  4. ASP.NET Core 防止跨站请求伪造(XSRF/CSRF)攻击 (转载)

    什么是反伪造攻击? 跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可能会影响客户端浏览器和浏览器信任网站之间的交互.这种攻击是完全有可能的 ...

  5. ASP.NET web api 跨域请求

    1.学习文章:AJAX 跨域请求 - JSONP获取JSON数据 1.asp.net代码 参考文章:http://www.sxt.cn/info-2790-u-756.html (1).增加CorsH ...

  6. ASP.NET MVC 允许跨域请求设置

    场景:创建一个图片上传的站点,用于其他站点跨域上传附件和图片之类. 上传插件结合百度的 webuploader.js 经常会碰到,跨域的问题,如下, 处理方式呢,是在web.config 中配置允许跨 ...

  7. ASP.NET Core 防止跨站请求伪造(XSRF/CSRF)攻击

    什么是反伪造攻击? 跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可能会影响客户端浏览器和浏览器信任网站之间的交互.这种攻击是完全有可能的 ...

  8. Asp.net Core CORS 跨域

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

  9. asp.net core api 跨域配置

    项目前后端分离,前端请求接口例如使用axios发送请求时浏览器会提示跨域错误,需要后端配置允许接口跨域 配置步骤: 1.通过NuGet安装Microsoft.AspNetCore.Cors.dll类库 ...

随机推荐

  1. codedecision P1113 同颜色询问 题解 线段树动态开点

    题目描述:https://www.cnblogs.com/problems/p/11789930.html 题目链接:http://codedecision.com/problem/1113 这道题目 ...

  2. SuperSocket通过本地证书仓库的证书来启用 TLS/SSL

    你也可以通过本地证书仓库的证书,而不是使用一个物理文件. 你只需要在配置中设置你要使用的证书的storeName和thumbprint: <server name="EchoServe ...

  3. [转载] CentOS系统开机自动挂载光驱 和 fstab文件详解

    参考 http://blog.itpub.net/12272958/viewspace-676977/ 一.开机自动挂载光驱 1.按习惯,root用户,在/media目录下建立目录cdrom——mkd ...

  4. 【机器学习】【条件随机场CRF-2】CRF的预测算法之维特比算法(viterbi alg) 详解 + 示例讲解 + Python实现

    1.CRF的预测算法条件随机场的预测算法是给定条件随机场P(Y|X)和输入序列(观测序列)x,求条件概率最大的输出序列(标记序列)y*,即对观测序列进行标注.条件随机场的预测算法是著名的维特比算法(V ...

  5. Vue进阶

    组件深入 过渡&动画 可复用性&组合 工具&规模化&内在 ****************参考*************** vue官方教程

  6. axios 跨域

    {     headers:{"Content-Type":"application/x-www-form-urlencoded;charset=utf-8"} ...

  7. H3C VLAN配置示例

  8. vue中处理时间格式化的问题

    vue main.js中修改Date原型链,插入(百度) Date.prototype.format = function(fmt) { var o = { "M+" : this ...

  9. ZR提高失恋测3

    ZR提高失恋测3 题目链接 (感觉这一场比以往的简单了一些) 估分 100 + 40 + 40 得分 100 + 60 + 40 ??? A 首先,我们能够想到一个比较简单的\(n^2\)做法, 枚举 ...

  10. TransactionDefinition接口中定义了七个事务传播行为

    1.PROPAGATION_REQUIRED如果存在一个事务,则支持当前事务,如果没有事务则开启一个新的事务.使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在 ...