using System; using System.Net; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.HttpOverrides; namespace Microsoft.AspNetCore.Builder { /// /// Extensions for the . /// 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 (preferred)
/// - AspNetCore_Appl_Path in the settings file
///
/// Additionally you can specify the proxy server by using or a when there are multiple proxy servers. ///
/// When no oder is set, the default IPv4 private subnets are configured:
/// - 10.0.0.0/8
/// - 172.16.0.0/12
/// - 192.168.0.0/16 ///
/// The application builder. /// The where proxy requests are received from (optional). /// The where proxy requests are received from (optional). public static void 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) { 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)); } if (network != null) options.KnownNetworks.Add(network); if (address != null) options.KnownProxies.Add(address); app.UseForwardedHeaders(options); } } }