ASP.NET Core主机地址过滤HostFiltering

原文:ASP.NET Core主机地址过滤HostFiltering

前言

在ASP.Net Core2.X调用的CreateWebHostBuilder和3.X的主要区别在于WebHost的调用,CreateDefaultBuilder被Host替换,另一个区别是对ConfigureWebHostDefaults()的调用;

由于新的主机生成器是通用主机生成器,因此我们也需要知道默认Web主机配置默认配置了什么.ConfigureWebHostDefaults为我们默认做了哪些配置?我们一起来看看他为我们默认配置的HostFiltering,HostFilteringMiddleware,其实他做的是对请求主机头的限制,也相当于一个请求主机头白名单,标识着某些主机头你可以访问,其余的你别访问了我这边未允许.

如何使用

在这之初打算的是为给大家分享一下如何配置;算了,我们一起开拓一下思维看看他是如何做的这个中间件吧.顺便再说说当我们使用ASP.NET Core在我们使用中如何配置,使用主机头白名单

Copy


 services.PostConfigure<HostFilteringOptions>(options =>
{
         if (options.AllowedHosts == null || options.AllowedHosts.Count == 0)
         {
         // "AllowedHosts": "localhost;127.0.0.1;[::1]"
         var hosts = Configuration["AllowedHosts"]?.Split(new[] { ‘;‘ }, StringSplitOptions.RemoveEmptyEntries);
         // Fall back to "*" to disable.
         options.AllowedHosts = (hosts?.Length > 0 ? hosts : new[] { "*" });
  }
});

HostFilteringOptions

  • AllowedHosts允许访问的Host主机
  • AllowEmptyHosts是否允许请求头Host的值为空访问 默认为true
  • IncludeFailureMessage 返回错误信息,默认为true

在Configure方法中添加HostFiltering中间件

Copy

   public void Configure(Microsoft.AspNetCore.Builder.IApplicationBuilder app, IWebHostEnvironment env)

        {
            app.UseHostFiltering();
            app.Run(context =>
            {
                return context.Response.WriteAsync("Hello World! " + context.Request.Host);
            });
        }

appsettings.json

Copy

{
  "AllowedHosts": "127.0.0.1"
}

这样就好了,那么我们再来测试一下看看.

源码解析

Copy

        /// <summary>
        /// Processes requests
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public  Task Invoke(HttpContext context)
        {
            var allowedHosts = EnsureConfigured();//获取允许Host集合

            if (!CheckHost(context, allowedHosts))//判断当前Host是否在允许的Host集合中
            {
                return HostValidationFailed(context);//如果不在400
            }

            return _next(context);//继续走下一个中间件
        }

        private Task HostValidationFailed(HttpContext context)
        {
            context.Response.StatusCode = 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;
        }
        private IList<StringSegment> EnsureConfigured()
        {
            if (_allowAnyNonEmptyHost == true || _allowedHosts?.Count > 0)//判断配置是否为空
            {
                return _allowedHosts;
            }

            return Configure();
        }

        private IList<StringSegment> Configure()
        {
            var allowedHosts = new List<StringSegment>();
            if (_options.AllowedHosts?.Count > 0 && !TryProcessHosts(_options.AllowedHosts, allowedHosts))
            {
                _logger.WildcardDetected();
                _allowedHosts = allowedHosts;
                _allowAnyNonEmptyHost = true;
                return _allowedHosts;
            }

            if (allowedHosts.Count == 0)//至少一个Host
            {
                throw new InvalidOperationException("No allowed hosts were configured.");
            }

            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.AllowedHosts(string.Join("; ", allowedHosts));
            }

            _allowedHosts = allowedHosts;
            return _allowedHosts;
        }

总结

这篇文章主要也许能给大家开阔一下思维,其实他的实现逻辑很简单,当我们请求带着Host头去访问的时候,通过该中间件判断该Host头是否在我们预先配置好的里面,如果在里面那么就继续请求下一个中间件,如果说不在那么不好意思400

原文地址:https://www.cnblogs.com/lonelyxmas/p/11960756.html

时间: 2024-11-07 08:15:35

ASP.NET Core主机地址过滤HostFiltering的相关文章

asp.net core MVC 全局过滤器之ExceptionFilter过滤器(一)

本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core MVC 过滤器之ActionFilter过滤器(二) asp.net core MVC 过滤器之ResultFilter过滤器(三) asp.net core MVC 过滤器之ResourceFilter过滤器(四) asp.net core MVC 过滤器之AuthorizationFilter过

ASP.NET Core技术研究-探秘Host主机启动过程

原文:ASP.NET Core技术研究-探秘Host主机启动过程 当我们将原有ASP.NET 应用程序升级迁移到ASP.NET Core之后,我们发现代码工程中多了两个类Program类和Startup类. 接下来我们详细探秘一下通用主机Host的启动过程. 一.Program类的Main函数入口 Program类最重要的功能就是启动主机,这里有一个主机的概念,是ASP.NET Core全新引入的. 主机负责应用程序启动和生存期管理. 同时,主机也是封装应用程序资源的对象: 依赖注入 (DI)

win10下iis部署asp.net core rtm

随着ASP.NET Core 1.0 rtm的发布,网上有许多相关.net core 相关文章,今刚好有时间也在win10环境上搭建下 ASP.NET Core的部署环境,把过程记录下给大家. 1. 开发运行环境 1> Visual Studio 2015 Update 3* 2> .NET Core 1.0 for Visual Studio (包括asp.net core 模板,其中如果机器上没有.net core sdk会默认安装)地址 https://go.microsoft.com/

【翻译】ASP.NET Core 入门

ASP.NET Core 入门 原文地址:Introduction to ASP.NET Core         译文地址:asp.net core 简介           翻译:ganqiyin [!注意] 这些说明适用于最新版本的ASP.NET Core. 旧版本入门查看? 请参阅1.1版本教程.. 安装 .NET Core. 2.创建一个新的 .NET Core 项目. 在macOS和Linux上,打开一个终端窗口. 在Windows上,打开命令提示符. dotnet new razo

【翻译】介绍 ASP.NET Core 中的 Razor Pages

介绍 ASP.NET Core 中的 Razor Pages 原文地址:Introduction to Razor Pages in ASP.NET Core         译文地址:介绍 asp.net core 中的 Razor Pages          翻译:ganqiyin Razor Pages 是 ASP.NET Core MVC 的一个新功能,可以让基于页面的编程方案更容易,更高效. 如果您正在寻找使用 Model-View-Controller 的教程,请参阅ASP.NET

ASP.NET Core 微服务初探[1]:服务发现之Consul

在传统单体架构中,由于应用动态性不强,不会频繁的更新和发布,也不会进行自动伸缩,我们通常将所有的服务地址都直接写在项目的配置文件中,发生变化时,手动改一下配置文件,也不会觉得有什么问题.但是在微服务模式下,服务会更细的拆分解耦,微服务会被频繁的更新和发布,根据负载情况进行动态伸缩,以及受资源调度影响而从一台服务器迁移到另一台服务器等等.总而言之,在微服务架构中,微服务实例的网络位置变化是一种常态,服务发现也就成了微服务中的一个至关重要的环节. 服务发现是什么 其实,服务发现可以说自古有之,我们每

ASP.NET Core MVC 视图

ASP.NET Core MVC中视图的知识和ASP.NET MVC有很多相似之处,学习难度较低.以下内容主要体现了编程中模块化的思想,模块化才应是我们关注的重点. Layout 布局用于提供各个页面所需的公共部分,如:菜单.页头.页尾等.在ASP.NET Core中默认的布局文件是位于/Views/Shared文件夹下的_Layout.cshtml文件: 我们通常在_Layout.cshtml中引入公共资源,如: <link href="~/css/reset.css" rel

总结:利用asp.net core日志进行生产环境下的错误排查(asp.net core version 2.2,用IIS做服务器)

概述 调试asp.net core程序时,在输出窗口中,在输出来源选择“调试”或“xxx-ASP.NET Core Web服务器”时,可以看到类似“info:Microsoft.AspNetCore.Hosting.Internal.WebHost[2] Request finished in 285.6ms 200 text/css”这样的内容,这就是asp.net core的日志 如果出现了未捕获的异常,在输出窗口中可以看到出错信息,如:fail: Microsoft.AspNetCore.

在ASP.NET Core中通过EF Core实现一个简单的全局过滤查询

前言 不知道大家是否和我有同样的问题: 一般在数据库的设计阶段,会制定一些默认的规则,其中有一条硬性规定就是一定不要对任何表中的数据执行delete硬删除操作,因为每条数据对我们来说都是有用的,并且是值得分析的. 所以我们一般会在每张表中加一个"是否删除IsDeleted"或者"是否有效IsValid"的字段,来标识这条数据的状态是否可用! 那么疑问来了,在写SQL或者Linq的时候我们到底是要加上这个条件还是忽略这个条件呢?答案当然是根据实际业务需求和情况来决定.