前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >.NET 中的 ForwardedHeaders

.NET 中的 ForwardedHeaders

作者头像
JusterZhu
发布2025-01-23 20:35:49
发布2025-01-23 20:35:49
5300
代码可运行
举报
文章被收录于专栏:JusterZhuJusterZhu
运行总次数:0
代码可运行

.NET 中的 ForwardedHeaders

Intro

ForwardedHeaders 主要是用于反向代理的场景,网站应用经常依赖多层服务器和代理来处理传入请求,这可能导致请求头在传输过程中被修改或丢失。我们可以通过 ForwardedHeaders 来处理多层代理,在 ASP.NET Core 中我们可以使用 ForwaredHeaders 中间件来处理 ForwaredHeaders 从而在程序里获取到用户的实际请求信息,尤其是获取用户的请求 IP 时如果使用了反向代理又不考虑 forwarded header 大概率会出问题

Forwarded Headers

当客户端向服务器发出请求时,它包含各种头部信息,这些信息提供了关于请求的客户端IP地址、用户代理等的信息。然而,当请求经过中间服务器或代理时,这些头部信息可能会被修改或删除。这可能会对应用程序造成问题,特别是对那些依赖这些头部信息的应用程序来说。

Forwarded headers是在 HTTP 请求中添加的一组特殊头部,用于传递关于客户端和代理之间连接的信息。这些头部可以包含客户端的IP地址、代理服务器的IP地址、协议(HTTP或HTTPS)以及其他相关的元数据。

使用 Forwarded headers 的目的是为了解决代理服务器转发请求时可能引起的一些问题。例如,当客户端通过多个代理服务器发送请求时,传统的HTTP头部中的信息可能会被覆盖或丢失,导致无法正确追踪请求的源头。

使用Forwarded headers的注意事项包括:

  1. 安全性:由于Forwarded headers中包含了客户端的真实IP地址等敏感信息,因此在使用时需要确保适当的安全措施,以防止信息泄露或恶意篡改。
  2. 验证:在使用Forwarded headers时,需要进行验证以确保这些头部信息的可信度。可以通过检查头部中的IP地址是否与实际连接的IP地址相符来进行验证。
  3. 兼容性:由于Forwarded headers并不是HTTP标准的一部分,因此在使用时需要考虑兼容性问题。不同的代理服务器和应用程序可能对这些头部的处理方式有所不同,需要进行适当的配置和测试。

ASP.NET Core 的 Forwarded Headers 中间件允许您配置框架如何处理转发的头部信息。它使您能够从代理添加的头部信息中提取原始值,并相应地更新 HttpContext。

使用 Forwarded headers 可以提供更准确和可靠的请求追踪和连接信息.

Sample

代码语言:javascript
代码运行次数:0
复制
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.All;
});
var app = builder.Build();
app.MapGet("/", (HttpContext context) => new
{
    ForwardedHeaders = context.RequestServices.GetRequiredService<IOptions<ForwardedHeadersOptions>>().Value
        .ForwardedHeaders.ToString(),
    ConnectIp = context.Connection.RemoteIpAddress?.ToString(),
    RequestHeaders = context.Request.Headers.ToDictionary(h => h.Key, h => h.Value.ToString()),
    Url = context.Request.GetDisplayUrl()
});
await app.RunAsync();

我们可以使用 app.UseForwarededHeaders() 来显式地使用 Forwarded headers 中间件,也可以通过配置 ASPNETCORE_FORWARDEDHEADERS_ENABLED 环境变量来配置启用 forwarded headers 中间件

我们模拟反向代理的请求,设置 forwareded headers 请求上前面的 API

forwarded-headers-enabled

可以看到 response 返回的 IP 不是 localhost, url 也不是请求的 localhost 而是从 forwarded header 转换之后的 amazingdotnet.dev

之前只支持 X-Forwarded-Host/X-Forwarded-Proto/X-Forwareded-For ,在 .NET 8 里支持了 X-Forwarded-Prefix

X-Forwareded-Host: Host

X-Forwarded-Proto: Schema/Protocal

X-Forwarded-For: IP

X-Forwarded-Prefix: BasePath

More

在使用 Forwarded Headers 中间件时,需要考虑安全性方面的影响。确保只信任来自受信任的代理的头部信息,并在使用之前对值进行验证。

此外,要注意 Forwarded Headers 中间件可能会引入一些性能开销,因为需要额外的处理来处理转发的头部信息。需要评估对应用程序性能的影响,并进行相应的调整。

References

  • https://github.com/dotnet/aspnetcore/issues/23263
  • https://github.com/dotnet/aspnetcore/pull/49249
  • https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer
  • https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.httpoverrides.forwardedheadersmiddleware?view=aspnetcore-8.0
  • https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.builder.forwardedheadersoptions?view=aspnetcore-8.0
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JusterZhu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • .NET 中的 ForwardedHeaders
    • Intro
    • Forwarded Headers
    • Sample
    • More
    • References
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档