【发布时间】:2011-02-06 22:26:01
【问题描述】:
如何获取当前访问者的 IP 地址?
【问题讨论】:
标签: asp.net ip-address
如何获取当前访问者的 IP 地址?
【问题讨论】:
标签: asp.net ip-address
编辑:还发现了一个关于 IP 相关的 http 标头 here 的有趣问题。
Edit2: 正如我在上面提供的 cmets 和链接中所提到的,HTTP_X_FORWARDED_FOR 标头可能包含多个用逗号分隔的 IP 地址。我没有遇到这种情况,但假设需要对我的答案进行一些更正。
我使用此代码获取 IP 地址(如果由于某种原因失败,则返回 IPAddress.None 值):
/// <summary>
/// Gets the IP address of the request.
/// <remarks>
/// This method is more useful than built in because in some cases it may show real user IP address even under proxy.
/// <summary>
/// Gets the IP address of the request.
/// <remarks>
/// This method is more useful than built in because in some cases it may show real user IP address even under proxy.
/// The <see cref="System.Net.IPAddress.None" /> value will be returned if getting is failed.
/// </remarks>
/// </summary>
/// <param name="request">The HTTP request object.</param>
/// <returns></returns>
public static IPAddress GetIp(this HttpRequest request)
{
string ipString;
if (string.IsNullOrEmpty(request.ServerVariables["HTTP_X_FORWARDED_FOR"]))
{
ipString = request.ServerVariables["REMOTE_ADDR"];
}
else
{
ipString = request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
.FirstOrDefault();
}
IPAddress result;
if (!IPAddress.TryParse(ipString, out result))
{
result = IPAddress.None;
}
return result;
}
【讨论】:
X-Forwarded-For 标头是可以伪造的,所以不要基于它做出任何安全决策。如果机器位于负载均衡器或反向代理之后,则仅检查 HTTP_X_FORWARDED_FOR 值。
X-Forwarded-For,然后代理有它自己的映射,这样客户端IP就不会到达主机。我对吗?另外,您确定第一个 IP 是原始 IP...我的意思是,它被定义为代理和负载均衡器附加而不是添加到 IP 列表中
HttpContext.Current.Request.UserHostAddress;
或
HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
或
HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
【讨论】:
Request.UserHostAddress
【讨论】:
public String GetIP()
{
string ipString;
if (string.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]))
{
ipString = Request.ServerVariables["REMOTE_ADDR"];
}
else
{
ipString = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
}
return ipString;
}
首先尝试找出代理IP,如果它为空我们可以得到该系统IP
【讨论】:
试试这个来获取用户的外部IP地址..
public static string getExternalIp()
{
try
{
string externalIP;
externalIP = (new WebClient()).DownloadString("http://checkip.dyndns.org/");
externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
.Matches(externalIP)[0].ToString();
return externalIP;
}
catch { return null; }
}
【讨论】: