本文翻译整理自: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. 解决TortoiseSVN中out of date问题的一个方法

    http://blog.csdn.net/freefalcon/article/details/645058 从去年开始,公司的代码管理从CVS转向了subvsersion,后者确实是前者的一个飞跃, ...

  2. Project Euler Problem 5-Smallest multiple

    对每个数字分解素因子,最后对每个素因子去其最大的指数,然后把不同素因子的最大指数次幂相乘,得到的就是最小公倍数 python不熟练,代码比较挫 mp = {} def process(n): i = ...

  3. 2007年NOIP普及组复赛题解

    题目涉及算法: 奖学金:结构体排序: 纪念品分组:贪心: 守望者的逃离:动态规划: Hanoi 双塔问题:递推. 奖学金 题目链接:https://www.luogu.org/problem/P109 ...

  4. mybatis 逆向工程(通过数据库表针对单表自动生成mybatis执行所需要的代码)

    mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java.mapper.xml.pojo…),可以让程序员 ...

  5. Java中方法的格式

    [修饰符] 返回值类型 方法名([参数类型 形式参数1,参数类型 形式参数2,……]) {             执行语句;     [return 返回值;]//需要的话 } 参数列表(参数的类型 ...

  6. HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite

    org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite r ...

  7. H3C TFTP协议介绍

  8. H3C 根据主机地址数划分子网

  9. Vue基础练习之计算属性、方法、监听器

    <body> <div id="root"> {{fullName()}} {{age}} </div> <script> var ...

  10. asp dotnet core 通过图片统计 csdn 用户访问

    在 csdn 的访问统计里面,只能用 csdn 提供的访问统计,因为在 csdn 中不支持在博客加上 js 代码,也就是无法使用友盟等工具统计. 通过在 asp dotnet core 创建一个图片链 ...