如何在 asp.net 中使用 C# 获取 IP 地址
本文关键字:获取 IP 地址 asp net | 更新日期: 2023-09-27 18:32:54
我想在我的代码中获取访问者的公共IP地址。
我写了下面的代码来获取它:
var context = System.Web.HttpContext.Current;
string ip = String.Empty;
if (context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
{
ip = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}
else if (!String.IsNullOrWhiteSpace(context.Request.UserHostAddress))
{
ip = context.Request.UserHostAddress;
}
if (ip == "::1")
ip = "127.0.0.1";
return ip;
我没有获得确切的 IP 地址 它返回如下值: fe80::9419:dfb3:22ce:4e88%68
但是当我在"我的 IP 是什么?"中看到我的 IP 时,它会显示13.67.58.30
。如何获取确切的 IP 地址?
我建议不要使用Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
。原因是它是由X-Forwarded-For
HTTP 标头传递的,并且所有 HTTP 标头都可以被欺骗。如果使用您的代码,用户只需替换标头即可模拟他们想要的任何 IP。此外,不能保证所有代理都会首先放置该标头。
可以使用以下命令获取用户的 IP 地址:
string ip = context.Request.UserHostAddress;
您看到的数字很可能是客户端的IPv6地址。
UserHostAddress.此方法获取当前请求的 IP 地址。它在 ASP.NET 框架中使用 UserHostAddress 属性。这是获取 IP 地址的字符串表示形式的最简单方法。例。首先,此示例代码介绍 Application_BeginRequest 方法,该方法在用户每次访问网站时执行。您可以通过转到添加 -> 全局应用程序类来添加它。在Application_BeginRequest中,我们获取当前的 HttpRequest,然后访问 UserHostAddress 字符串属性。最后,我们将字符串值写入输出并完成请求。获取 IP 地址的方法:ASP.NET、C#
using System;
using System.Web;
namespace WebApplication1
{
public class Global : HttpApplication
{
protected void Application_BeginRequest(object sender,
EventArgs e)
{
// Get request.
HttpRequest request = base.Request;
// Get UserHostAddress property.
string address = request.UserHostAddress;
// Write to response.
base.Response.Write(address);
// Done.
base.CompleteRequest();
}
}
}
申请结果
127.0.0.1
IP 地址。在此示例中,我在 localhost 服务器上运行了该程序,该服务器是我的计算机上的服务器。在这种情况下,连接只是本地连接,这意味着我的本地地址是返回的 IP 地址。注意:如果此代码在远程服务器上运行,将返回我的互联网连接的 IP 地址。
总结。我们使用 UserHostAddress 属性获取用户的当前 IP 地址。此方法返回一个字符串,其中的数字由句点分隔。如果您需要按 IP 记录或特殊情况的用户,这可以直接在字典中使用。
您尝试使用此代码获取的是您自己的IP,无论如何这是一个古老的问题,请看这里。
对我来说,最好的回应是来自mangokun,但反应可以通过这种方式增强:
protected string GetIPAddress()
{
var context = HttpContext.Current;
var ip = context.Request.ServerVariables["REMOTE_ADDR"];
if (IsInternal(ip)) {
string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
ip = ipAddress.Split(',')[0];
}
return ip;
}
/* An IP should be considered as internal when:
::1 - IPv6 loopback
10.0.0.0 - 10.255.255.255 (10/8 prefix)
127.0.0.0 - 127.255.255.255 (127/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
*/
public bool IsInternal(string testIp)
{
if(testIp == "::1") return true;
byte[] ip = IPAddress.Parse(testIp).GetAddressBytes();
switch (ip[0])
{
case 10:
case 127:
return true;
case 172:
return ip[1] >= 16 && ip[1] < 32;
case 192:
return ip[1] == 168;
default:
return false;
}
}
要获取请求客户端 IP,您可以使用以下命令读取它:
var clientIp = Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ??
Request.ServerVariables["REMOTE_ADDR"];
您看到的IP地址是IPv6地址,因此它们是有效的IP号,由客户端发送HTTP标头,因此对此无能为力。
您需要记住的一件事是,HTTP_X_FORWARDED_FOR可以包含多个有效的 IP 号码。
var listIp = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
clientIp = string.IsNullOrEmpty(listIp) ? Request.ServerVariables["REMOTE_ADDR"]
: listIp.Split(',')[0];
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>User's IP Address using ASP.NET</title>
<script language="C#" runat="server">
public void Page_Load(Object sender, EventArgs e)
{
//Print the time when the page loaded initially
Response.Write("<span class='logo' />The Page Loaded at: " + DateTime.Now.ToLongTimeString());
divLANIPAddress.InnerHtml = GetLanIPAddress().Replace("::ffff:","");
}
/*
Method to get the IP Address of the User
*/
public String GetLanIPAddress()
{
//The X-Forwarded-For (XFF) HTTP header field is a de facto standard for identifying the originating IP address of a
//client connecting to a web server through an HTTP proxy or load balancer
String ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ip))
{
ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
return ip;
}
</script>
<style type="text/css">
body
{
background-color:#32373a;
color:#FFFFFF;
}
#mainBody
{
background-color:#FFFFFF;
height:100%;
color:#32373a;
}
.divMainTime
{
width:350px;
height:30px;
background-color:#fdd136;
font-size:14px;
vertical-align:middle;
padding-top: 5px;
}
#divLANIPAddress
{
font-size:20px;
float:right;
margin-right:10px;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div id='mainBody'>
<h1>
Retrieve User's IP Address
</h1>
<br />
<div class='divMainTime'>
<div style='float:left;font-size:18px;'>User's IP Address :</div>
<div id="divLANIPAddress" runat="server"></div>
</div>
</div>
</form>
</body>
</html>