我想找到用户的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";
}
在控制器内使用以下方式获取客户端 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