访问我的网站时如何获取客户端IP地址?

时间:2021-07-26 06:48:31

标签: c# asp.net-mvc asp.net-core

我使用 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.UserHostAddressServerVariables["REMOTE_ADDR"] 在 dotnet 核心中无效。 请问有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我假设您不是通过将 Kesterl 直接暴露给最终客户端而是在某个反向代理 (IIS/nginx) 下运行该网站。在这种情况下,要使 Connection.RemoteIpAddress 工作属性,您必须通过在启动中添加类似以下代码的内容来配置应用程序:

app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor })