using System; using System.Net; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.HttpOverrides; using IPNetwork = Microsoft.AspNetCore.HttpOverrides.IPNetwork; namespace Microsoft.AspNetCore.Builder { /// /// Extensions for the . /// [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public static class ApplicationBuilderExtensions { /// /// Adds settings to run behind a reverse proxy (e.g. NginX). /// /// /// A base path (e.g. running in a sub-directory /app) for the application can be defined via ASPNETCORE_APPL_PATH environment variable. ///
///
/// Additionally you can specify the proxy server by using or a when there are multiple proxy servers. ///
/// When neither nor is set, the default subnets are configured: /// /// 127.0.0.0/8 /// ::1/128 /// /// 10.0.0.0/8 /// 172.16.0.0/12 /// 192.168.0.0/16 /// fd00::/8 /// ///
/// The application builder. /// The where proxy requests are received from (optional). /// The where proxy requests are received from (optional). /// A custom base path (optional, ASPNETCORE_APPL_PATH is prefererred). public static IApplicationBuilder UseProxyHosting(this IApplicationBuilder app, IPNetwork network = null, IPAddress address = null, string basePath = null) { string path = Environment.GetEnvironmentVariable("ASPNETCORE_APPL_PATH"); if (string.IsNullOrWhiteSpace(path)) path = basePath; if (!string.IsNullOrWhiteSpace(path)) app.UsePathBase(new PathString(path)); var options = new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.All }; options.KnownProxies.Clear(); options.KnownNetworks.Clear(); if (network == null && address == null) { // localhost options.KnownNetworks.Add(new IPNetwork(IPAddress.Loopback, 8)); options.KnownNetworks.Add(new IPNetwork(IPAddress.IPv6Loopback, 128)); // private IPv4 networks // see https://en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("10.0.0.0"), 8)); options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("172.16.0.0"), 12)); options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("192.168.0.0"), 16)); // private IPv6 networks // see https://en.wikipedia.org/wiki/Private_network#Private_IPv6_addresses options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("fd00::"), 8)); } if (network != null) options.KnownNetworks.Add(network); if (address != null) options.KnownProxies.Add(address); app.UseForwardedHeaders(options); return app; } } }