【问题标题】:How do I obtain Client IP address in .net-core instead of the load balancers? (using X-Forwarded-For)如何在 .net-core 而不是负载均衡器中获取客户端 IP 地址? (使用 X-Forwarded-For)
【发布时间】:2021-05-02 22:38:53
【问题描述】:

我只是想在他们 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"] 它返回 null / empty。

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

【问题讨论】:

  • SO 无法帮助您确定谁错了 - 很明显,如果您在请求中没有看到标头,则标头不存在。要么您不知道您的代码在哪里运行/“客户端”和“服务器”之间的路径上还有哪些其他代理,或者您的 OPS 团队没有告诉您有关标头的所有详细信息......因为您显然已经尝试调用您的代码直接与该标题一起工作,我不明白 SO 有什么帮助。

标签: c# .net iis .net-core x-forwarded-for


【解决方案1】:

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

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

HttpContext.Current.Request.Headers["X-Forwarded-For"].Split(new 
char[] { ',' }).FirstOrDefault()

【讨论】:

  • 但它没有返回任何如上所述的内容。我什么也得不到。
【解决方案2】:

你可以试试这个方法获取客户端IP地址:

1.添加Microsoft.AspNet.HttpOverrides包。

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

app.UseOverrideHeaders(new OverrideHeaderMiddlewareOptions
 {
    ForwardedOptions = ForwardedHeaders.XForwardedFor | 
                       ForwardedHeaders.XForwardedProto
 });

【讨论】:

    【解决方案3】:

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

    我们刚刚遇到了同样的问题。即使在控制器中,我们也无法获取标头“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");
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 2016-02-17
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多