我目前有一个RESTful C#Web服务,可以获取客户端的IP地址。这一点工作正常,直到实现负载平衡。所以现在Web服务正处于负载均衡器的后面。
现在,每当我尝试获取用户的IP地址时,我都会获得负载均衡器的IP地址。这是代码的样子......
System.Web.HttpContext context = System.Web.HttpContext.Current;
if (context.Request.ServerVariables.AllKeys.Contains("HTTP_CLIENT_IP") && CheckIP(context.Request.ServerVariables["HTTP_CLIENT_IP"]))
return new Model(context.Request.ServerVariables["HTTP_CLIENT_IP"]);
if (context.Request.ServerVariables.AllKeys.Contains("HTTP_X_FORWARDED_FOR"))
foreach (string ip in context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(','))
if (CheckIP(ip.Trim()))
return new Model(ip.Trim());
if (context.Request.ServerVariables.AllKeys.Contains("HTTP_X_FORWARDED") && CheckIP(context.Request.ServerVariables["HTTP_X_FORWARDED"]))
return new Model(context.Request.ServerVariables["HTTP_X_FORWARDED"]);
if (context.Request.ServerVariables.AllKeys.Contains("HTTP_X_CLUSTER_CLIENT_IP") && CheckIP(context.Request.ServerVariables["HTTP_X_CLUSTER_CLIENT_IP"]))
return new Model(context.Request.ServerVariables["HTTP_X_CLUSTER_CLIENT_IP"]);
if (context.Request.ServerVariables.AllKeys.Contains("HTTP_FORWARDED_FOR") && CheckIP(context.Request.ServerVariables["HTTP_FORWARDED_FOR"]))
return new Model(context.Request.ServerVariables["HTTP_FORWARDED_FOR"]);
if (context.Request.ServerVariables.AllKeys.Contains("HTTP_FORWARDED") && CheckIP(context.Request.ServerVariables["HTTP_FORWARDED"]))
return new Model(context.Request.ServerVariables["HTTP_FORWARDED"]);
return new Model(context.Request.ServerVariables["REMOTE_ADDR"]);
尽管如此,我仍然最终得到了错误的IP地址。有什么想法吗?想法?我错过了什么吗?
答案 0 :(得分:4)
行为良好的负载均衡器应在X_FORWARDED_FOR标头中放置一个或更多 IP地址。您的代码正在检查 HTTP_FORWARDED_FOR 以及其他两个不太正确的变量。
并非所有负载均衡器都表现良好,有些负载均衡器可以配置为包含该标头(如果当前不在其中)。
如果有多个转发点,则标头中将有多个IP地址。在这种情况下,列出的第一个是客户端IP
X-Forwarded-For:client,proxy1,proxy2
答案 1 :(得分:0)
string sIpaddress = "";
if (Request.Headers["True-Client-IP"] != null)
{
sIpaddress = Request.Headers["True-Client-IP"]; //if the user is behind a proxy server
}
if (sIpaddress == "")
{
if (Request.Headers["CF-CONNECTING-IP"] != null)
sIpaddress = Request.Headers["CF-CONNECTING-IP"];
}
if (sIpaddress == "")
{
if (Request.Headers["X-Forwarded-For"] != null)
sIpaddress = Request.Headers["X-Forwarded-For"];
}
if (sIpaddress == "")
{
if (Request.ServerVariables["REMOTE_ADDR"] != null)
sIpaddress = Request.ServerVariables["REMOTE_ADDR"];
}