首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 取得伺服器與用戶端 IP、MAC 位址完整方案

     編輯:關於ASP.NET

伺服器端 IP 位址取得

方法一:DNS 解析 (最簡單、適用多網卡)

protected void btnGetServerIP_Click(object sender, EventArgs e)
{
    IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName());
    // 過濾 IPv4 位址
    var ipv4List = addresses.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).ToList();
    
    if (ipv4List.Count > 0)
        txtPrimaryIP.Text = ipv4List[0].ToString();
    if (ipv4List.Count > 1)
        txtSecondaryIP.Text = ipv4List[1].ToString();
    else
        txtSecondaryIP.Text = "無第二張網卡 IPv4";
}

注意:Dns.GetHostByName 已過時,改用 Dns.GetHostAddresses。

方法二:WMI 查詢網卡設定 (同時取得 MAC)

using System.Management;

public void GetServerIPAndMAC()
{
    string mac = "", ip = "";
    ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection moc = mc.GetInstances();
    
    foreach (ManagementObject mo in moc)
    {
        if ((bool)mo["IPEnabled"] == true) // 只取已啟用 IP 的網卡
        {
            mac = mo["MACAddress"].ToString(); // 格式: 00:1A:2B:3C:4D:5E
            string[] ips = (string[])mo["IPAddress"];
            if (ips.Length > 0) ip = ips[0]; // 取第一個 IP
            break; // 通常只需第一張啟用網卡
        }
    }
    txtMAC.Text = mac;
    txtIP.Text = ip;
}

需參考 System.Management.dll,執行需管理員權限或 WMI 安全性設定。

用戶端 IP 位址取得

標準方法

string clientIP = Request.UserHostAddress; // 直接取得
// 或
string clientIP = Request.ServerVariables["REMOTE_ADDR"];

穿透 Proxy/Load Balancer 取得真實 IP

public string GetRealClientIP()
{
    string ip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (!string.IsNullOrEmpty(ip))
    {
        // 可能多層 Proxy,取第一個 (原始客戶端)
        return ip.Split(',')[0].Trim();
    }
    ip = Request.ServerVariables["HTTP_X_REAL_IP"]; // Nginx 常用
    if (!string.IsNullOrEmpty(ip)) return ip;
    return Request.UserHostAddress; // 回退
}

用戶端 MAC 位址取得:現實限制與替代方案

方案可行性限制
ARP 協定 (SendARP API)同區域網路跨路由器/閘道無效;需 P/Invoke iphlpapi.dll
WMI 查詢用戶端極低需用戶端開放 WMI、防火牆、權限,瀏覽器環境不可行
ActiveX / Silverlight / Java Applet已淘汰現代瀏覽器不支援,安全性極差
DHCP 租約表 / 交換器 MAC 表伺服器端基礎設施需網管配合,非應用層可直接取得

實務建議:不要在 Web 應用強求用戶端 MAC

  1. 識別用戶裝置:使用 Cookie、LocalStorage、指紋辨識、裝置 ID (需用戶授權)。
  2. 網路存取控制:在網路層 (NAC、802.1X、VPN) 實施 MAC 綁定,非應用層職責。
  3. 內部系統:若為企業內網已知環境,可部署 Client Agent (WinForms/WPF/服務) 定期上報 MAC/IP 至中央資料庫,Web 端查詢資料庫即可。

完整工具類別

public static class NetworkUtils
{
    public static string GetServerPrimaryIPv4()
    {
        return Dns.GetHostAddresses(Dns.GetHostName())
                 .FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork)?.ToString();
    }
    
    public static (string IP, string MAC) GetServerFirstEnabledNIC()
    {
        using (var mc = new ManagementClass("Win32_NetworkAdapterConfiguration"))
        foreach (ManagementObject mo in mc.GetInstances())
        {
            if ((bool)mo["IPEnabled"])
            {
                var ips = (string[])mo["IPAddress"];
                return (ips.Length > 0 ? ips[0] : "", mo["MACAddress"]?.ToString() ?? "");
            }
        }
        return ("", "");
    }
    
    public static string GetClientRealIP(HttpRequest request)
    {
        var headers = new[] { "HTTP_X_FORWARDED_FOR", "HTTP_X_REAL_IP", "REMOTE_ADDR" };
        foreach (var h in headers)
        {
            var val = request.ServerVariables[h];
            if (!string.IsNullOrEmpty(val))
                return h == "HTTP_X_FORWARDED_FOR" ? val.Split(',')[0].Trim() : val;
        }
        return request.UserHostAddress;
    }
}

結語

伺服器 IP/MAC 取得有標準 API (DNS/WMI) 可靠實現;用戶端 IP 需處理 Proxy 標頭;**用戶端 MAC 在瀏覽器 Web 應用中基本無法直接取得**,應改用裝置指紋、Cookie 或基礎設施層方案。切勿為了取得 MAC 引入 ActiveX 等高風險技術。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved