ASP.NET Core:如何获取远程 IP 地址?
Posted
技术标签:
【中文标题】ASP.NET Core:如何获取远程 IP 地址?【英文标题】:ASP.NET Core: How to get remote IP address? 【发布时间】:2016-04-01 09:06:32 【问题描述】:我尝试获取远程(客户端)IP 地址:
var ip = httpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress
但它只适用于本地请求(它会返回::1
值)
当我从远程机器加载页面时,该值为空。我调查了这种情况下Features
集合中没有IHttpConnectionFeature
。
为什么?以及如何正确获取远程IP地址?
【问题讨论】:
据我所知,它存在几个问题,特别是如果您将它托管在负载均衡器和/或 iis 后面。有一个UseOverrideHeaders
左右,但是会在rc2中重命名为UseForwardedHeaders
,见公告github.com/aspnet/Announcements/issues/147。但据我了解,这可能对您也没有帮助,因为它返回最后一个 X-Forwarded-For 在许多云部署中将是反向代理而不是原始用户。
但据我所知,讨论中有一个功能允许确定从哪个跃点获取 X-Forwarded-For(即 2 个跃点返回,而不仅仅是最新的
我认为这是一个很好的答案***.com/a/36316189/625581
How do I get client IP address in ASP.NET CORE?的可能重复
【参考方案1】:
我知道这篇文章很旧,但我来到这里寻找同样的问题,最后我做到了:
在 project.json 添加依赖:
"Microsoft.AspNetCore.HttpOverrides": "1.0.0"
在 Startup.cs 中,在 Configure 方法中添加:
app.UseForwardedHeaders(new ForwardedHeadersOptions
ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto
);
当然还有:
using Microsoft.AspNetCore.HttpOverrides;
然后,我得到了这样的ip:
Request.HttpContext.Connection.RemoteIpAddress
在我的例子中,在 VS 中调试时,我总是得到 IpV6 localhost,但是当部署在 IIS 上时,我总是得到远程 IP。
一些有用的链接: How do I get client IP address in ASP.NET CORE? 和 RemoteIpAddress is always null
::1 可能是因为:
在 IIS 上的连接终止,然后转发到 v.next Web 服务器 Kestrel,因此与 Web 服务器的连接确实来自 localhost。 (https://***.com/a/35442401/5326387)
【讨论】:
当您发现类似问题并发布类似答案时,您可能需要在两者之间添加交叉引用。特别是如果一个看起来比另一个更完整。 HTH @superjos 你是什么意思? 还有另一个 SO question here 非常接近这个问题,并且您基本上复制了相同的答案。在这种情况下,将一个问题指向另一个问题可能很有用。甚至可能将问题标记为关闭。 是的,答案是一样的,因为我回答了这两个问题。我一直在寻找相同的解决方案,当我找到解决方案时,我回答了两个问题(我没有标记为重复,因为两者都在前一段时间被问到并且都已经有不同的答案没有解决问题)【参考方案2】:试试这段代码,
var ipAddress = HttpContext.Connection.RemoteIpAddress;
如果您在同一个 LAN 中有另一台计算机,请尝试与这台计算机连接,但使用用户 ip 而不是 localhost。否则,您将始终得到 ::1 结果。
【讨论】:
谢谢,我想知道为什么它总是显示 ::1 结果,您的评论帮助我解决了问题。干杯=]以上是关于ASP.NET Core:如何获取远程 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET CORE 3.1 中获取客户端 IP 地址?
如何在 ASP.NET Core 2.1 中获取客户端 IP 地址