我使用 dotnet core 3.1,我需要网站访问者的 IP 地址,但是当我尝试获取时,返回的是服务器的 IP,而不是客户端的 IP。这是我使用的代码:
var ip = _accessor.ActionContext.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
这将返回空值。然后我尝试使用第三方网站获取我的 IP 地址。所以我这样做了:
WebRequest request = WebRequest.Create("https://api.ipify.org/");
这也将返回服务器的 IP 地址,而不是客户端。然后我尝试了这个:
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
return ip.ToString();
}
}
还有这个:
string localIP = string.Empty;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
socket.Connect("8.8.8.8", 65530);
IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
localIP = endPoint.Address.ToString();
}
但它们返回本地 IP 地址。 return localIP.ToString();
有些代码行 HTTPContext.Current.Request.UserHostAddress
或 ServerVariables["REMOTE_ADDR"]
在 dotnet 核心中无效。
请问有什么建议吗?
答案 0 :(得分:0)
我假设您不是通过将 Kesterl
直接暴露给最终客户端而是在某个反向代理 (IIS/nginx) 下运行该网站。在这种情况下,要使 Connection.RemoteIpAddress
工作属性,您必须通过在启动中添加类似以下代码的内容来配置应用程序:
app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor })