一、介绍

  主机地址过滤中间件相当于一个白名单,标记哪些主机地址能访问接口。

二、使用

  新建WebAPI项目,修改Startup中的代码段如下所示。下面表示允许主机名为“localhost”的主机访问(不区分大小写),其他主机地址访问此项目的接口都会返回400错误。

    public void ConfigureServices(IServiceCollection services){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);var hosts = new List<string>();hosts.Add("localhost"); //添加配置services.AddHostFiltering(x =>{x.AllowedHosts = hosts;//设置允许访问的Host 最少需要设置一个x.AllowEmptyHosts = false;//是否允许请求头Host的值为空访问  默认值为truex.IncludeFailureMessage = true;//true表示返回错误信息,false表示返回空 默认为true});}public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseHsts();}       //使用中间件app.UseHostFiltering();app.UseMvc();}

(正常访问)

上面为正常访问情况,为了模拟通过其他域名访问此接口,配置Host文件,在Host文件末尾加上下面一句话,通过地址https://baidu.com:5001/api/values来访问https://localhost:5001/api/values,这样做的目的是改变浏览器请求头中的Host的值为baidu.com。

localhost       baidu.com

(返回400)

由于请求头中没有填写Host信息,浏览器自动解析地址,将baidu.com作为Host的值,由于baidu.com不在我们定义的允许访问的主机地址中,所以返回400。但是我们可以伪造请求头,如下图:

(伪造请求头)

也可以直接将Host的值为空,因为上面配置的是运行为空的主机名访问。

三、源码解析

  既然是中间件,最重要的一个方法就是Invoke,因为这个方法会在每个请求中被调用。

    public Task Invoke(HttpContext context){var allowedHosts = EnsureConfigured();//获取配置的允许访问的Host集合列表if (!CheckHost(context, allowedHosts))//通过Http上下文,获取当前请求的Host,并判断是否在运行访问的Host列表中{context.Response.StatusCode = 400;//如果不在访问列表中,返回400,并判断是否返回错误信息,如果返回错误信息,就将错误信息写到报文体中if (_options.IncludeFailureMessage){context.Response.ContentLength = DefaultResponse.Length;context.Response.ContentType = "text/html";return context.Response.Body.WriteAsync(DefaultResponse, 0, DefaultResponse.Length);}return Task.CompletedTask;}return _next(context);//委托 调用下一个中间件}private IList<StringSegment> EnsureConfigured(){if (_allowAnyNonEmptyHost == true || _allowedHosts?.Count > 0)//判断配置的是不是允许为空{return _allowedHosts;}var allowedHosts = new List<StringSegment>();if (_options.AllowedHosts?.Count > 0 && !TryProcessHosts(_options.AllowedHosts, allowedHosts)){_logger.LogDebug("Wildcard detected, all requests with hosts will be allowed.");_allowedHosts = allowedHosts;//将配置的值赋给_alloweHosts_allowAnyNonEmptyHost = true;return _allowedHosts;}if (allowedHosts.Count == 0)//Host至少配置一个{throw new InvalidOperationException("No allowed hosts were configured.");}if (_logger.IsEnabled(LogLevel.Debug)){_logger.LogDebug("Allowed hosts: {Hosts}", string.Join("; ", allowedHosts));}_allowedHosts = allowedHosts;return _allowedHosts;}

这个中间件逻辑很简单,总体来说就是判断请求头中的Host的值是否在配置的列表中,如果在,就下面一个中间件继续处理。如果不在,就返回400状态码。

转载于:https://www.cnblogs.com/MicroHeart/p/9672367.html

.Net Core 中间件之主机地址过滤(HostFiltering)源码解析相关推荐

  1. abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析

    老版Abp对Castle的严重依赖在vnext中已经得到了解决,vnext中DI容器可以任意更换,为了实现这个功能,底层架构相较于老版abp,可以说是进行了高度重构.当然这得益于.Net Core的D ...

  2. [数据库中间件-Mycat 1.6.7.6-release源码解析系列]-1-直接从MyCAT入口开始说起

    目录 1-直接从MyCAT入口开始说起:MycatStartup 1.1 初始化MycatStartup 1.1.1 MycatStartup 启动入口 1.2 ZkConfig-Zookeeper初 ...

  3. .Net Core 源码解析

    .Net core 源码解析 启动代码 创建并配置主机Builder CreateDefaultBuilder分析 Host类-用于产生初始的builder静态类 IHostBuilder转变成IWe ...

  4. .NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

    写在前面 上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它,接着带着你一步一步的配置了.NET Core的开发环境并创建了一个ASP.NET Core的mvc项目,同时又通过一个实战 ...

  5. .net core 源码解析-mvc route的注册,激活,调用流程(三)

    .net core mvc route的注册,激活,调用流程 mvc的入口是route,当前请求的url匹配到合适的route之后,mvc根据route所指定的controller和action激活c ...

  6. Gin源码解析和例子——中间件(middleware)

    在<Gin源码解析和例子--路由>一文中,我们已经初识中间件.本文将继续探讨这个技术.(转载请指明出于breaksoftware的csdn博客) Gin的中间件,本质是一个匿名回调函数.这 ...

  7. php 本地mysql 代码_基于本地数据库的 IP 地址查询 PHP 源码

    * 纯真 IP 数据库查询 * * 参考资料: * - 纯真 IP 数据库 http://www.cz88.net/ip/ * - PHP 读取纯真IP地址数据库 http://ju.outofmem ...

  8. .Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析

    介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还 ...

  9. Spring源码解析【完整版】--【bilibili地址:https://www.bilibili.com/video/BV1oW41167AV】

    [本文为bilibili视频雷丰阳的Spring源码解析的完整版总结文章,其中文章前面大部分为他人博文的搬运,后面补充了其未总结的部分] 一.Java的注解 1. 注解的概念 注释:用文字描述程序,给 ...

最新文章

  1. 收藏 | 图像识别的可视化解释神经网络
  2. c语言作业 统计成绩,C语言作业 输入多名学生3门课程成绩,并统计成绩的平均分和总分,并根据总分输出名次。...
  3. vmware虚拟机克隆后,启动网卡报错device eth0 does not seem to be present, delaying initialization...
  4. [YTU]_2576( 虚函数练习:动物2)
  5. Win10中VMware14安装CentOS7详细步骤
  6. Java 对象初始化过程
  7. webclientt和httpwebrequest
  8. Ball Dropping
  9. 明晚7点,中科院专家带你走进智能计算系统的世界
  10. VS2012下基于Glut OpenGL glEdgeFlag示例程序:
  11. 语音识别免费的api
  12. Linux交换空间(swap space)
  13. workbench动力学周炬_ANSYS WORKBENCH有限元分析实例详解(动力学)
  14. 闭环系统辨识matlab,系统辨识-12-闭环辨识
  15. 4万字长文全面解读数据中台、数据仓库和数据湖
  16. python中英文时间转换
  17. 网站被黑怎么查被入侵原因和日志
  18. pptpd 安装步骤
  19. 2021年中国人工智能行业全景图谱
  20. python发送esc_使用win32prin将一行文本发送到Python中的ESC/POS打印机

热门文章

  1. 【leetcode】Min Stack -- python版
  2. MySQL check table/optimize table/analyze table/REPAIR TABLE
  3. [蓝桥杯历届试题] 海盗比酒量
  4. 用uliweb 创建项目
  5. CVPR2020 Oral | 旷视研究院提出双边分支网络BBN:攻坚长尾分布的现实世界任务
  6. 免费中文深度学习课程来了!北大本科生同款,孙剑领衔旷视研究团队开讲
  7. 如何一行代码搞定SSD模型推理与结果解析
  8. CV Code | 本周新出计算机视觉开源代码汇总(含实例分割、行人检测、姿态估计、神经架构搜索、超分辨率等)...
  9. 游戏建模之3Dmax的重要性
  10. 2021高校毕业生薪酬Top100出炉!