Skip to content

Commit b476d21

Browse files
author
Weihan Li
committed
feat: support ForwardedHeaders configuration
1 parent d75d9b3 commit b476d21

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

src/DefaultBuilder/src/ForwardedHeadersOptionsSetup.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,24 @@ public void Configure(ForwardedHeadersOptions options)
2424
return;
2525
}
2626

27-
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
27+
var forwardedHeaders = _configuration["ForwardedHeaders_Headers"];
28+
if (string.IsNullOrEmpty(forwardedHeaders))
29+
{
30+
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
31+
}
32+
else
33+
{
34+
var headers = ForwardedHeaders.None;
35+
foreach (var headerName in forwardedHeaders.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
36+
{
37+
if (Enum.TryParse<ForwardedHeaders>(headerName, true, out var headerValue))
38+
{
39+
headers |= headerValue;
40+
}
41+
}
42+
options.ForwardedHeaders = headers;
43+
}
44+
2845
// Only loopback proxies are allowed by default. Clear that restriction because forwarders are
2946
// being enabled by explicit configuration.
3047
options.KnownNetworks.Clear();

src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebHostTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,38 @@ public async Task WebHostConfiguration_EnablesForwardedHeadersFromConfig()
8383
result.EnsureSuccessStatusCode();
8484
}
8585

86+
[Fact]
87+
public async Task WebHostConfiguration_EnablesForwardedHeaders_CustomHeaders_FromConfig()
88+
{
89+
using var host = WebHost.CreateDefaultBuilder()
90+
.ConfigureAppConfiguration(configBuilder =>
91+
{
92+
configBuilder.AddInMemoryCollection(new[]
93+
{
94+
new KeyValuePair<string, string>("FORWARDEDHEADERS_ENABLED", "true" ),
95+
new KeyValuePair<string, string>("FORWARDEDHEADERS_HEADERS", "All" ),
96+
});
97+
})
98+
.UseTestServer()
99+
.Configure(app =>
100+
{
101+
Assert.True(app.Properties.ContainsKey("ForwardedHeadersAdded"), "Forwarded Headers");
102+
app.Run(context =>
103+
{
104+
Assert.Equal("https", context.Request.Scheme);
105+
Assert.Equal("/test", context.Request.PathBase.Value);
106+
return Task.CompletedTask;
107+
});
108+
}).Build();
109+
110+
await host.StartAsync();
111+
var client = host.GetTestClient();
112+
client.DefaultRequestHeaders.Add("x-forwarded-proto", "https");
113+
client.DefaultRequestHeaders.Add("x-forwarded-prefix", "/test");
114+
var result = await client.GetAsync("http://localhost/");
115+
result.EnsureSuccessStatusCode();
116+
}
117+
86118
[Fact]
87119
public void CreateDefaultBuilder_RegistersRouting()
88120
{

0 commit comments

Comments
 (0)