public virtual string GetClientIp(HttpRequestBase request)
{
var ipAddress = request.UserHostAddress;
// get client IP from reverse proxy
var xForwardedFor = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(xForwardedFor))
{
// Search for public IP addresses
var publicForwardingIps = xForwardedFor.Split(',').Where(ip => !IsPrivateIpAddress(ip)).ToList();
// If we found any public IP, return the last one, otherwise return the user host address
return publicForwardingIps.Any() ? publicForwardingIps.Last().Trim() : ipAddress;
}
return ipAddress;
}