在 ASP.NET Core 中,ForwardedHeadersOptions
用于配置转发头(Forwarded Headers)的处理。转发头通常在代理服务器(如负载均衡器或反向代理)将请求转发到应用程序时使用。这些头信息包含了原始请求的客户端 IP 地址、主机名等信息,因为直接从 HttpContext
获取的信息可能只是代理服务器的地址。
配置 ForwardedHeadersOptions
以下是如何配置 ForwardedHeadersOptions
的示例:
var builder = WebApplication.CreateBuilder(args);
// 配置转发头选项
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
// 指定要处理的转发头
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
// 可选:配置信任的代理服务器
options.KnownProxies.Add(IPAddress.Parse("192.168.1.100"));
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("192.168.1.0"), 24));
// 可选:配置 X-Forwarded-For 和 X-Forwarded-Proto 的最大跳数
options.ForwardLimit = 2;
});
var app = builder.Build();
// 启用转发头中间件
app.UseForwardedHeaders();
// 其他中间件配置
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.Run();
配置选项解释
ForwardedHeaders
:指定要处理的转发头。常见的转发头包括:ForwardedHeaders.XForwardedFor
:用于获取原始请求的客户端 IP 地址。ForwardedHeaders.XForwardedProto
:用于获取原始请求的协议(HTTP 或 HTTPS)。ForwardedHeaders.XForwardedHost
:用于获取原始请求的主机名。
KnownProxies
:指定信任的代理服务器列表。只有来自这些代理服务器的请求才会被处理转发头信息。KnownNetworks
:指定信任的网络范围。来自这些网络的请求也会被处理转发头信息。ForwardLimit
:设置 X-Forwarded-For 和 X-Forwarded-Proto 的最大跳数。这有助于防止伪造的转发头信息。
使用场景
- 负载均衡器:当应用程序部署在负载均衡器后面时,负载均衡器会将请求转发到应用程序。通过配置转发头,应用程序可以获取原始请求的客户端 IP 地址和协议信息,而不是负载均衡器的地址.
- 反向代理:在使用反向代理(如 Nginx 或 IIS)时,反向代理会将请求转发到应用程序。配置转发头可以确保应用程序获取正确的客户端信息.
注意事项
- 安全性:确保只信任可靠的代理服务器和网络,以防止伪造的转发头信息导致安全问题.
- 顺序:在中间件管道中,
UseForwardedHeaders
应该在UseRouting
和UseAuthentication
之前调用,以确保转发头信息在路由和认证之前被正确处理.
通过合理配置 ForwardedHeadersOptions
,你可以确保应用程序在使用代理服务器时能够获取正确的客户端信息,从而提高应用程序的安全性和可靠性.