1

我只是想在 POST 之后在 .net-core 控制器中获取客户端 IP 地址。我们在客户端和服务器之间有一个负载平衡器。

我的启动中的设置:

            services.Configure<ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders =
                    ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
            });

并配置:

app.UseForwardedHeaders();

然后我尝试调用下面的代码,但它返回负载均衡器 IP 地址,而不是客户端 IP:

var clientIpAddress = HttpContext.Connection.RemoteIpAddress.ToString();

我已经尝试了可以​​在此网站和文档上搜索的所有内容,但似乎没有任何效果。我也尝试过使用HttpContext.Request.Headers["X-Forwarded-For"] which 返回 null / empty。

我们的 OPS 团队说 IP 没有被平衡器修改,并且应该在 x-Forwarded-For 标头的值中。为什么负载均衡器发回它的 IP 而不是客户端 IP 地址?

4

3 回答 3

0

您对中间件的设置是正确的,我也有相同的设置。

我们刚刚遇到的同样的问题。即使在控制器中,我们也无法获取标头“X-Forwarded-For”的标头中的值。部署后,一切都挂了,出现 500 错误。所以我做了一个你可以在 _Layout.cshtml 中说的非法代码,你知道在这个客户端文件中我可以读取像 X-Forwarded-For、X-Azure-ClientIP 和 X-Azure-SocketIP 这样的标题。并且所有人都只能有一个IP地址,那就是客户端的公共IP地址。从布局页面获取 IP 地址后,您可以将该值存储在会话中并重定向到任何其他页面,并且从该页面您可以使用会话中的 IP 地址。下面是布局中用于读取标题的代码。

if (string.IsNullOrEmpty(HttpContextAccessor.HttpContext.Session.GetString("ClientIpAddress")))
{
    Microsoft.Extensions.Primitives.StringValues headerIPAddress = string.Empty;
    HttpContextAccessor.HttpContext.Request.Headers.TryGetValue("X-Forwarded-For", out headerIPAddress);
    HttpContextAccessor.HttpContext.Session.SetString("ClientIpAddress", headerIPAddress.ToString());
    HttpContextAccessor.HttpContext.Response.Redirect("~/Home/Index");
}
于 2022-01-18T18:19:38.887 回答
0

您可以尝试此方法获取客户端 IP 地址:

1.添加Microsoft.AspNet.HttpOverrides包。

2.n 你的 configure() 方法添加下面的代码。

app.UseOverrideHeaders(new OverrideHeaderMiddlewareOptions
 {
    ForwardedOptions = ForwardedHeaders.XForwardedFor | 
                       ForwardedHeaders.XForwardedProto
 });
于 2021-01-29T03:06:54.717 回答
-2

在 X-Forwarded-For 你会得到客户端ip,proxy1 & proxy2.

获取客户端/用户IP的第一项,第一项是原始客户端IP

HttpContext.Current.Request.Headers["X-Forwarded-For"].Split(new 
char[] { ',' }).FirstOrDefault()
于 2021-01-29T02:30:12.557 回答