首页 > 解决方案 > C# 网络接口在开发服务器上没有工作

问题描述

我正在尝试使用 c# Web API 获取客户端的唯一机器地址。我在本地服务器上运行以下代码时使用网络接口获取 MAC 地址,它运行良好。但是当我将它部署在开发服务器上时,我得到了一些奇怪的相同地址。

下面是我用来获取 MAC 地址的代码。

 public string GetMacAddress()
            {
                NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
                String macAddress = string.Empty;
                foreach (NetworkInterface adapter in nics)
                {
                    if (macAddress == String.Empty)  
                    {
                        IPInterfaceProperties properties = adapter.GetIPProperties();
                        macAddress = adapter.GetPhysicalAddress().ToString();
                    }
                }
                return macAddress;



        }

注意:如果有任何可能的方法来唯一标识用户机器。

标签: c#asp.net-coremac-addressef-core-2.0

解决方案


您的代码返回您自己的NIC MAC 地址。

您无法检索连接到您的客户端的 MAC 地址。MAC 是OSI 方案中的第 2 层地址。路由器剥离源和目标 MAC 地址,并将其替换为自己的 MAC 作为源,下一个网络跃点作为目标。您应该改用 IP 地址(第 3 层)。

如果你使用Sockets,你可以使用这个方法:how to get client IP using socket programming c#

如果你使用 asp.net webserver 你可以使用这个Request.UserHostAddress

两者都将返回其 ISP 分配的客户端公共 IP 地址。此 IP 地址通常会在夜间或路由器重置时更改。

这将是与从同一本地网络连接的其他用户相同的 IP 地址。例如,如果家里有 2 台电脑和 3 部手机通过 wifi 连接,它们将共享同一个公共 IP 地址。要唯一标识每一个,您应该使用某种令牌,如 cookie、sessionid 和/或身份验证,如下所示:如何在 ASP.NET 应用程序中唯一标识客户端计算机?. (对于(asp.net)网络服务器)但是可以删除 cookie,然后下次必须更换。虽然您可以通过这种方式区分不同的用户,但您不能确定识别出单个用户,因为他们可能有多个按时间(已删除和新)或空间(不同的浏览器/设备同时具有不同的有效 cookie)分隔的 cookie )

另一种方法是与每个客户端一起发送一个唯一的证书,并在手头有一个数据库来匹配它们。(用于网络应用)

此处讨论了获取唯一客户端标识符的其他方法:如何使用 C# 唯一标识计算机?在这里:Get Unique System Identifiers in C#。但是,它们确实依赖于您在客户端计算机上执行代码,可能会被欺骗,不可靠,可能会随着时间而改变等。

简而言之:没有可靠和简单的方法,特别是如果您不能像在 Web 服务器场景中那样在客户端上执行代码。此外,您决定用作标识符的任何内容都可能随时间而变化(新 IP、新硬件、新浏览器版本、新操作系统等)、有重复、在某些机器上不可靠或不可用(例如:客户端上的 HD-GUID仅限网络驱动器),和/或可能被欺骗(mac、请求标头等)。

这完全取决于您的需求、可用的资源以及您想要的东西有多容易出错和安全。


推荐阅读