Я хочу получить ip-адрес, который регистрируется на моем сайте. Как это сделать в ASPNET. Я использовал следующий код, но он не получает правильный IP-адрес
string ipaddress = Request.UserHostAddress;
Я хочу получить ip-адрес, который регистрируется на моем сайте. Как это сделать в ASPNET. Я использовал следующий код, но он не получает правильный IP-адрес
string ipaddress = Request.UserHostAddress;
Этот метод можно использовать для получения IP-адреса клиентской машины.
public static String GetIP()
{
String ip =
HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ip))
{
ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
return ip;
}
В ситуации, когда вы используете IP-адрес для обеспечения безопасности, вы должны знать о своей инфраструктуре.
Если вы используете прокси-сервер между вашим веб-сервером и вашими клиентами, который устанавливает заголовок, вы должны быть в состоянии доверять последнему адресу. Затем вы используете код, например, предложенный Мухаммедом с обновлением, чтобы всегда получать последний IP-адрес из прямого заголовка (см. Код ниже).
Если вы не используете прокси-сервер, будьте осторожны, что заголовок X-Forwarded-For очень легко обмануть. Я предлагаю вам игнорировать это, если у вас нет ясной причины, почему бы и нет.
Я обновил код Мухаммеда Ахтара следующим образом, чтобы вы могли выбрать:
public string GetIP(bool CheckForward = false)
{
string ip = null;
if (CheckForward) {
ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
}
if (string.IsNullOrEmpty(ip)) {
ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
} else { // Using X-Forwarded-For last address
ip = ip.Split(',')
.Last()
.Trim();
}
return ip;
}
Эта статья Wikipedia объясняет риски более тщательно.
Необходимо использовать HTTP_X_FORWARDED_FOR, но он может возвращать несколько IP-адресов, разделенных запятой. См. эту страницу.
Поэтому вы всегда должны его проверять. Я лично использую функцию Split.
public static String GetIPAddress()
{
String ip =
HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ip))
ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
else
ip = ip.Split(',')[0];
return ip;
}
В MVC 6 вы получаете IP-адрес следующим образом:
HttpContext.Request.HttpContext.Connection.RemoteIpAddress.ToString()
Если клиент подключается через прозрачный неанонимный прокси, вы можете получить свой адрес:
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
который может возвращать значение null или "unknown", если IP-адрес не может быть получен таким образом.
Request.ServerVariables["REMOTE_ADDR"]
должен быть таким же, как Request.UserHostAddress
, любой из которых может быть использован, если запрос не принадлежит не анонимному прокси.
Однако, если запрос поступает из анонимного прокси-сервера, тогда невозможно напрямую получить IP-адрес клиента. Вот почему они называют анонимных прокси.
В вашем aspx файле убедитесь, что у вас есть допустимые декалярации страницы вверху. По какой-то причине мой был закомментирован.
Каким-то образом это произошло:
<%--<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="cookieTracker.aspx.cs" Inherits="comp466TMA1.cookieTracker" %>--%>
Вместо:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="cookieTracker.aspx.cs" Inherits="comp466TMA1.cookieTracker" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Cookie Tracker</title>
</head>
<body>
Hey, this is a site tracker using a cookie.
You have visited this site:<%= visits %> times.
Your ip address is <%= incomingIp %>
</body>
</html>
string result = string.Empty;
string ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ip))
{
string[] ipRange = ip.Split(',');
int le = ipRange.Length - 1;
result = ipRange[0];
}
else
{
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}