在 ASP.NET Core 部署到 Caddy 的场景中,获取用户的真实 IP 地址需要处理代理服务器(如 Caddy)传递的 X-Forwarded-For 或类似的头部信息。以下是实现步骤:
1. 配置 Caddy
确保 Caddy 正确地将客户端的真实 IP 地址传递给后端服务器。可以在 Caddyfile (默认路径:/etc/caddy/Caddyfile)中添加以下配置:
ttt.yuming.com {
# Set this path to your site's directory.
root * /root/wwwroot/ttt.yuming.com
# Enable the static file server.
file_server
# Another common task is to set up a reverse proxy:
reverse_proxy http://localhost:50051 {
header_up X-Forwarded-For {remote_host} #传递真实IP给后端服务器
header_up X-Forwarded-Proto {scheme} #传递真实协议给后端服务器
}
encode zstd gzip #启用zstd和gzip压缩
}
这会将客户端的真实 IP 地址通过 X-Forwarded-For 头部传递给 ASP.NET Core 应用。
2. 安装 ASP.NET Core 的依赖包
在 ASP.NET Core 中,使用 Microsoft.AspNetCore.HttpOverrides 包来处理代理头部。如果项目中尚未安装,请添加:
dotnet add package Microsoft.AspNetCore.HttpOverrides 或使用PM控制台 Install-Package Microsoft.AspNetCore.HttpOverrides
3. 配置 ASP.NET Core 应用
在 Program.cs 或 Startup.cs 中,启用 ForwardedHeadersMiddleware 来处理代理头部:
using Microsoft.AspNetCore.HttpOverrides;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// 配置 Forwarded Headers 中间件
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
4. 获取真实 IP 地址
在控制器或其他地方,可以通过以下代码获取用户的真实 IP 地址:
var clientIp = HttpContext.Connection.RemoteIpAddress?.ToString();
如果启用了 ForwardedHeadersMiddleware,RemoteIpAddress 会返回 X-Forwarded-For 中的真实 IP
注意事项
-
信任代理:默认情况下,ASP.NET Core 只信任本地代理。如果 Caddy 不在本地运行,需要显式信任代理 IP 地址:
- 安全性:确保只信任可信的代理服务器,以防止伪造的
X-Forwarded-For头部。
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
KnownProxies = { IPAddress.Parse("Caddy服务器的IP地址") }
});
浙公网安备 33010602011771号