如何使用 .NET Core 获取传入请求的 IP 地址

3

我在AZURE环境(PAAS)中部署了我的.NET CORE解决方案。我在那里使用以下代码片段来获取客户端的IP地址:

 dtoItem.LogIP = HttpContext.Connection.RemoteIpAddress.ToString();

我使用了标准的 .net core 库,并且在 Startup.cs 中进行了必要的更改。

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
    RequireHeaderSymmetry = false,
});

我相信我已经正确地实现了所有内容。但是我仍然没有得到准确的客户端IP地址。我始终获取客户的公共IP而不是私有IP。由于这可能会重复(同一办公室的2个用户具有相同的公共IP),因此我需要客户端的私有IP而不是公共IP。

在PAAS解决方案中是否有可能获取私有IP地址?如果不可能,是否有一种方式可以跟踪客户机的信息(例如IP地址、MAC地址)。


2
我觉得这不可能。你看过这个吗: https://dev59.com/x2oy5IYBdhLWcg3wHqiB#8756278 - Rob Sedgwick
你能解释一下客户端的公共\私有IP是什么意思吗?如果客户端被NAT\路由器“隐藏”起来,那么请求将由该路由器发出,在服务器上没有太多的方法可以发现内部的“隐藏”IP。你可以做的一件事是让客户端从客户设备中提取该信息并将其发送到请求中,但这样你就必须控制客户端,所以不能与愚蠢的HTTP请求一起使用。 - itaysk
这个问题更多是一个通用的 .net core 问题,而不是关于在 Azure App Service 上托管的问题。不确定你想解决什么问题,但如果你想获取 NAT 后面计算机的 IP 地址,你将无法使用服务器端代码来完成,而需要一些在客户端运行的 JavaScript 来获取这些数据,然后将其附加到发出的请求中或者将它回传给您的站点。 - Byron Tardif
感谢大家的建议。@itaysk - 请参考这篇文章,它说明了公共IP和私有IP之间的区别。链接。我认为通过JavaScript提取IP地址是个不错的解决方案。你有可靠的JS来提取客户端IP地址吗?Byron Tardif - KDS
2个回答

2
在PAAS解决方案中,是否可以获得私有IP地址?
“不可能的。在SO帖子答案中分享了关于MAC地址的信息。”
在客户端的JavaScript中,没有公开API来获取IPAddress(显然是出于安全考虑)。然后,您可以在服务器端获取IPAddress,但通常,如果您从公司访问互联网,则会通过公司代理进行访问,并且服务器看到的IPAddress将永远不是实际客户端IP,而是代理服务器的地址。因此,这在服务器端受限制,因为服务器只能看到代理(公共IP地址)。
如果不可能,那么是否有一种方式来跟踪客户端PC的信息(例如IP地址、MAC地址)?
您可以可靠地跟踪用户代理。将用户代理分解,我们可以获得有关浏览器、操作系统版本的一些信息。但是用户代理很容易被某些浏览器扩展欺骗。
如果您正在寻找浏览器指纹或跟踪,请查看Panopticlick,它显示了更多信息,例如安装的字体、屏幕分辨率、已安装的插件等,以跟踪任何客户端。fingerprintjs2 JavaScript库可帮助使用26个参数进行跟踪,截至今天。

1
这个问题没有直接的答案。Rob分享的帖子提供了一些很好的见解。但是,需要理解在请求到达服务器之前,很多事情都可能发生。中间的网络设备可以操纵TCP头,因此可能不反映您所需的正确IP地址。
从解决方案的角度来看,如果您开发自己的客户端并将此信息记录在某个地方以便跟踪,则可能完全可行。否则,没有可靠的方法获取此信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接