如何在 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 地址?

如何在 asp.net 中使用 C# 获取 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>