Skip to content
Open
31 changes: 30 additions & 1 deletion src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,42 @@
return;
}

options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
var forwardedHeaders = _configuration["ForwardedHeaders_Headers"];
if (string.IsNullOrEmpty(forwardedHeaders))
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
}
else
{
var headers = ForwardedHeaders.None;
foreach (var headerName in forwardedHeaders.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
{
if (Enum.TryParse<ForwardedHeaders>(headerName, true, out var headerValue))
{
headers |= headerValue;
}
}
options.ForwardedHeaders = headers;
}

// Only loopback proxies are allowed by default. Clear that restriction because forwarders are
// being enabled by explicit configuration.
#pragma warning disable ASPDEPR005 // KnownNetworks is obsolete
options.KnownNetworks.Clear();
#pragma warning restore ASPDEPR005 // KnownNetworks is obsolete
options.KnownIPNetworks.Clear();
options.KnownProxies.Clear();

var knownNetworks = _configuration["ForwardedHeaders_KnownNetworks"]?.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) ?? [];
foreach (var network in knownNetworks)
{
options.KnownNetworks.Add(IPNetwork.Parse(network));

Check failure on line 56 in src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs

View check run for this annotation

Azure Pipelines / aspnetcore-ci (Build Source-Build (Managed))

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs#L56

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs(56,13): error ASPDEPR005: (NETCORE_ENGINEERING_TELEMETRY=Build) 'ForwardedHeadersOptions.KnownNetworks' is obsolete: 'Please use KnownIPNetworks instead. For more information, visit https://aka.ms/aspnet/deprecate/005.'

Check failure on line 56 in src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs

View check run for this annotation

Azure Pipelines / aspnetcore-ci (Build Source-Build (Managed))

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs#L56

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs(56,39): error ASPDEPR005: (NETCORE_ENGINEERING_TELEMETRY=Build) 'IPNetwork' is obsolete: 'Please use System.Net.IPNetwork instead. For more information, visit https://aka.ms/aspnet/deprecate/005.'

Check failure on line 56 in src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs

View check run for this annotation

Azure Pipelines / aspnetcore-ci (Build Build: Linux ARM)

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs#L56

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs(56,13): error ASPDEPR005: (NETCORE_ENGINEERING_TELEMETRY=Build) 'ForwardedHeadersOptions.KnownNetworks' is obsolete: 'Please use KnownIPNetworks instead. For more information, visit https://aka.ms/aspnet/deprecate/005.'

Check failure on line 56 in src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs

View check run for this annotation

Azure Pipelines / aspnetcore-ci (Build Build: Linux ARM)

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs#L56

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs(56,39): error ASPDEPR005: (NETCORE_ENGINEERING_TELEMETRY=Build) 'IPNetwork' is obsolete: 'Please use System.Net.IPNetwork instead. For more information, visit https://aka.ms/aspnet/deprecate/005.'

Check failure on line 56 in src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs

View check run for this annotation

Azure Pipelines / aspnetcore-ci (Build Build: Linux ARM64)

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs#L56

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs(56,13): error ASPDEPR005: (NETCORE_ENGINEERING_TELEMETRY=Build) 'ForwardedHeadersOptions.KnownNetworks' is obsolete: 'Please use KnownIPNetworks instead. For more information, visit https://aka.ms/aspnet/deprecate/005.'

Check failure on line 56 in src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs

View check run for this annotation

Azure Pipelines / aspnetcore-ci (Build Build: Linux ARM64)

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs#L56

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs(56,39): error ASPDEPR005: (NETCORE_ENGINEERING_TELEMETRY=Build) 'IPNetwork' is obsolete: 'Please use System.Net.IPNetwork instead. For more information, visit https://aka.ms/aspnet/deprecate/005.'
}

var knownProxies = _configuration["ForwardedHeaders_KnownProxies"]?.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) ?? [];
foreach (var proxy in knownProxies)
{
options.KnownProxies.Add(System.Net.IPAddress.Parse(proxy));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,38 @@ public async Task WebHostConfiguration_EnablesForwardedHeadersFromConfig()
result.EnsureSuccessStatusCode();
}

[Fact]
public async Task WebHostConfiguration_EnablesForwardedHeaders_CustomHeaders_FromConfig()
{
using var host = WebHost.CreateDefaultBuilder()
.ConfigureAppConfiguration(configBuilder =>
{
configBuilder.AddInMemoryCollection(new[]
{
new KeyValuePair<string, string>("FORWARDEDHEADERS_ENABLED", "true" ),
new KeyValuePair<string, string>("FORWARDEDHEADERS_HEADERS", "All" ),
});
})
.UseTestServer()
.Configure(app =>
{
Assert.True(app.Properties.ContainsKey("ForwardedHeadersAdded"), "Forwarded Headers");
app.Run(context =>
{
Assert.Equal("https", context.Request.Scheme);
Assert.Equal("/test", context.Request.PathBase.Value);
return Task.CompletedTask;
});
}).Build();

await host.StartAsync();
var client = host.GetTestClient();
client.DefaultRequestHeaders.Add("x-forwarded-proto", "https");
client.DefaultRequestHeaders.Add("x-forwarded-prefix", "/test");
var result = await client.GetAsync("http://localhost/");
result.EnsureSuccessStatusCode();
}

[Fact]
public void CreateDefaultBuilder_RegistersRouting()
{
Expand Down
Loading