From 0e7f12bfb3a05ece7e73aceedb985e38023bdba1 Mon Sep 17 00:00:00 2001 From: "Chris Ross (ASP.NET)" Date: Fri, 23 Mar 2018 14:41:22 -0700 Subject: [PATCH] Add HostFiltering to the default web host --- build/dependencies.props | 37 ++++++++++--------- samples/SampleApp/appsettings.json | 1 + .../HostFilteringStartupFilter.cs | 21 +++++++++++ .../Microsoft.AspNetCore.csproj | 1 + src/Microsoft.AspNetCore/WebHost.cs | 10 +++++ .../CreateDefaultBuilderOfTApp/Startup.cs | 15 +++++++- .../appsettings.json | 1 + 7 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 src/Microsoft.AspNetCore/HostFilteringStartupFilter.cs diff --git a/build/dependencies.props b/build/dependencies.props index 899a04ac19..69c5b8ed06 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -4,26 +4,27 @@ 2.1.0-preview2-15742 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 0.5.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 0.5.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 + 2.1.0-preview2-30431 2.0.0 2.1.0-preview2-26314-02 - 15.6.0 + 15.6.1 4.7.49 2.3.1 2.4.0-beta.1.build3945 diff --git a/samples/SampleApp/appsettings.json b/samples/SampleApp/appsettings.json index 66f0f7ade6..6a1c35ebcf 100644 --- a/samples/SampleApp/appsettings.json +++ b/samples/SampleApp/appsettings.json @@ -1,4 +1,5 @@ { + "AllowedHosts": "example.com;localhost", "Kestrel": { "EndPoints": { "Http": { diff --git a/src/Microsoft.AspNetCore/HostFilteringStartupFilter.cs b/src/Microsoft.AspNetCore/HostFilteringStartupFilter.cs new file mode 100644 index 0000000000..56c6d9c34f --- /dev/null +++ b/src/Microsoft.AspNetCore/HostFilteringStartupFilter.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; + +namespace Microsoft.AspNetCore +{ + internal class HostFilteringStartupFilter : IStartupFilter + { + public Action Configure(Action next) + { + return app => + { + app.UseHostFiltering(); + next(app); + }; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore/Microsoft.AspNetCore.csproj b/src/Microsoft.AspNetCore/Microsoft.AspNetCore.csproj index 949e2a991c..e52a4f74ed 100644 --- a/src/Microsoft.AspNetCore/Microsoft.AspNetCore.csproj +++ b/src/Microsoft.AspNetCore/Microsoft.AspNetCore.csproj @@ -10,6 +10,7 @@ + diff --git a/src/Microsoft.AspNetCore/WebHost.cs b/src/Microsoft.AspNetCore/WebHost.cs index 1d5a1ecb9f..e9c21ed554 100644 --- a/src/Microsoft.AspNetCore/WebHost.cs +++ b/src/Microsoft.AspNetCore/WebHost.cs @@ -182,6 +182,16 @@ namespace Microsoft.AspNetCore logging.AddConsole(); logging.AddDebug(); }) + .ConfigureServices((hostingContext, services) => + { + var hosts = hostingContext.Configuration["AllowedHosts"]?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); + services.AddHostFiltering(options => + { + options.AllowedHosts = (hosts?.Length > 0 ? hosts : new[] { "*" }); + }); + + services.AddTransient(); + }) .UseIISIntegration() .UseDefaultServiceProvider((context, options) => { diff --git a/test/TestSites/CreateDefaultBuilderOfTApp/Startup.cs b/test/TestSites/CreateDefaultBuilderOfTApp/Startup.cs index eb82a20357..2bfb0cdfe9 100644 --- a/test/TestSites/CreateDefaultBuilderOfTApp/Startup.cs +++ b/test/TestSites/CreateDefaultBuilderOfTApp/Startup.cs @@ -4,8 +4,11 @@ using System; using System.IO; using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.HostFiltering; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; namespace CreateDefaultBuilderOfTApp { @@ -15,11 +18,12 @@ namespace CreateDefaultBuilderOfTApp { app.Run(context => { - return context.Response.WriteAsync(GetResponseMessage(webHostBuilderContext)); + var message = GetResponseMessage(webHostBuilderContext, app.ApplicationServices.GetRequiredService>()); + return context.Response.WriteAsync(message); }); } - private static string GetResponseMessage(WebHostBuilderContext context) + private static string GetResponseMessage(WebHostBuilderContext context, IOptions hostFilteringOptions) { // Verify ContentRootPath set if (!string.Equals(Directory.GetCurrentDirectory(), context.HostingEnvironment.ContentRootPath, StringComparison.Ordinal)) @@ -53,6 +57,13 @@ namespace CreateDefaultBuilderOfTApp return $"Command line arguments not loaded into Configuration."; } + // Verify allowed hosts were loaded + var hosts = string.Join(',', hostFilteringOptions.Value.AllowedHosts); + if (!string.Equals("example.com,localhost", hosts, StringComparison.Ordinal)) + { + return $"AllowedHosts not loaded into Options."; + } + // TODO: Verify AddConsole called // TODO: Verify AddDebug called // TODO: Verify UseIISIntegration called diff --git a/test/TestSites/CreateDefaultBuilderOfTApp/appsettings.json b/test/TestSites/CreateDefaultBuilderOfTApp/appsettings.json index 393b080efb..27eb1aaf44 100644 --- a/test/TestSites/CreateDefaultBuilderOfTApp/appsettings.json +++ b/test/TestSites/CreateDefaultBuilderOfTApp/appsettings.json @@ -1,5 +1,6 @@ { "settingsKey": "settingsValue", + "AllowedHosts": "example.com;localhost", "Kestrel": { "Endpoints": { "HTTP": {