我正在尝试从AspNetCore 2.1 API控制器内的客户端获取远程IP地址,但每次都获取相同的IP(Request.HttpContext?.Connection?.RemoteIpAddress?.ToString() == "::ffff:172.18.0.1"
(。
我的转发标头配置:
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.All,
RequireHeaderSymmetry = false,
KnownProxies = {
IPAddress.Parse("::ffff:172.18.0.0"),
IPAddress.Parse("::ffff:172.18.0.1"),
IPAddress.Parse("172.18.0.1"),
IPAddress.Parse("172.18.0.0")
}
});
我正在使用AspNetCore 2.1应用程序的标准Dockerfile。同样在Azure的Kudu面板中,我可以在标题中看到我的真实IP:X-Client-IP
和X-Forwarded-For
,但仍然无法在请求上下文中获得它。
我缺少什么?有其他方法可以从客户端获取远程Ip地址吗?
我们可以使用代码HttpContext.Connection.RemoteIpAddress;
来获取客户端IP地址,我已经测试了您的代码,它运行良好。
请执行以下故障排除:
1.确保在使用其他中间件之前调用UseForwardedHeaders
的方法。
2.默认情况下,未启用Forwarded Headers中间件。必须启用转发的标头中间件,应用程序才能使用UseForwardedHeaders处理转发的标头。
作为一个额外的解决方法,我们可以使用Request.Headers["X-Forwarded-For"]
而不是X-Client-IP
来获取客户端的IP地址。
我们可以做如下:
string IpAddress = null;
if (Request.Headers["X-Forwarded-For"].ToString().IndexOf(",") > 0)
{
IpAddress = Request.Headers["X-Forwarded-For"].ToString().Split(',')[0];
}
else
{
IpAddress = Request.Headers["X-Forwarded-For"].ToString();
}