本文翻译整理自: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. 2018-2-13-win10-uwp-如何让-Page-继承泛型类

    title author date CreateTime categories win10 uwp 如何让 Page 继承泛型类 lindexi 2018-2-13 17:23:3 +0800 201 ...

  2. Python--day21--复习

    序列化模块总结: jison格式化输出: Serialize obj to a JSON formatted str.(字符串表示的json对象) Skipkeys:默认值是False,如果dict的 ...

  3. java三大循环结构

    用于处理需要重复执行的操作: 根据判断条件的成立与否,决定程序段落的执行次数,而这个程序段落我们称为循环体: while:事先不需要知道循环执行多少次: do  while:同上,只是至少要执行一次( ...

  4. IntStack(存放int型值,带迭代器) 附模板化实现 p406

    1 该栈只用于存在int型数据 #include "../require.h" #include <iostream> using namespace std; cla ...

  5. Python--day40线程理论

    1,进程:

  6. P1077 子串乘积正负分类

    题目描述 给你一个序列包含 \(n\) 个元素的序列 \(a_1, a_2, \dots , a_n\) (每个元素 \(a_i \ne 0\)). 你需要计算如下两个值: 有多少对数 \((l, r ...

  7. java 类加载器的委托机制

    l 当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢? 1.首先当前线程的类加载器去加载线程中的第一个类. 2.如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B. 3 ...

  8. 解决 el-autocomplete 不显示及没数据时闪一下的问题

    项目中用到了elementUI中的远程搜索即 el-autocomplete 组件,估计首次使用的都会遇到一些小问题,只要你能认真看完并且耐心理解,保证能帮到你,效果图如下: 组件代码: <el ...

  9. H3C设置下次启动的配置文件

  10. CSS3 属性学习

    fill-available表示撑满可用空间(包括高度,宽度)[此处包括padding和margin会尽可能的撑满,只对于行内块(inline-block)和块元素(block)起作用,webkit内 ...