using System; using System.Net; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.HttpOverrides; 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 is 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 no oder is set, the default subnets are configured:
/// - 127.0.0.0/8
/// - 10.0.0.0/8
/// - 172.16.0.0/12
/// - 192.168.0.0/16
/// /// - ::1/128
/// - fd00::/8 ///
/// The application builder. /// The where proxy requests are received from (optional). /// The where proxy requests are received from (optional). public static IApplicationBuilder UseProxyHosting(this IApplicationBuilder app, IPNetwork network = null, IPAddress address = null) { string path = Environment.GetEnvironmentVariable("ASPNETCORE_APPL_PATH"); 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.Parse("127.0.0.0"), 8)); options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("::1"), 128)); // private IPv4 networks 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 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; } } }