如何在ASP.NET CORE中自动获取客户端IP

问题描述 投票:0回答:1

我想找到用户的IP,而不需要用户自动从URL本身提交请求。当我在本地执行此操作时,它返回正确的IP地址,但是当我在服务器上发布Web服务时,该IP成为服务器IP,我该怎么办?

例如,我在地址 https://test.com/api/GetAddress 有一个服务,我使用以下代码在 PostMan 中调用此服务,它会正确返回用户的 IP 地址,但是当该服务在地址为 https://sitetest.com/Dashboard/GetHome 的站点上被调用,服务器地址被返回,并且用户地址没有提供给我。

注意,我想通过 URL 本身获取这个 IP,因为如果我 将其放入请求中,并通过开发人员接收,它 可以给 Api 任何 IP。

我已经使用了两种类型的代码,但仍然相同:

public static string GetClientIp()
    {
        try
        {
            string strHostName = System.Net.Dns.GetHostName();
            IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList
                .FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);

            return ipAddress?.ToString();
        }
        catch (Exception ex)
        {
            return "10.0.0.0";
        }
        
        //return HttpContext.Current.Connection.RemoteIpAddress?.ToString() ?? "10.0.0.0";
    }
c# asp.net-core logging ip client
1个回答
1
投票

在控制器内使用以下方式获取客户端 IP 地址:

var address = Request.HttpContext.Connection.RemoteIpAddress;

如果您使用反向代理,则必须使用转发标头中间件。示例:

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

这是因为代理将请求转发到您的应用程序,因此 RemoteIpAdress 具有运行代理的计算机的 IP 地址。大多数代理通常使用原始 IP 地址设置 X-Forwarded-For 标头。该中间件读取 X-Forwarded-For 标头并正确设置 RemoteIpAdress。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For

© www.soinside.com 2019 - 2024. All rights reserved.