【问题标题】:C# Network Interface not woking on development server [closed]C#网络接口在开发服务器上不起作用[关闭]
【发布时间】:2019-02-06 07:40:57
【问题描述】:

我正在尝试使用 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;



        }

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

【问题讨论】:

  • 请添加更多信息。您如何“使用”网络接口。服务器上有多个接口吗?你想做什么?用户是谁?服务器的网卡或连接到它的任何人?另请注意,MAC 地址来自最后一个网络跃点,因此可能是您的路由器。一些代码会很好。
  • mac 地址只与本地链接真正相关。您的任何用户将计算机挂在与您的服务器相同的交换机上的可能性有多大?
  • 请提供失败的示例代码,以及您看到的错误消息。
  • IP 使用 IP 地址,而不是 MAC 地址。 SO 不知道您的 MAC 地址,但它确实知道您的IP。你想做什么?如果你想记录请求,IP 地址已经被 Web 服务器记录了
  • @kdmurray 我已经附上了代码,请仔细阅读。

标签: c# asp.net-core mac-address ef-core-2.0


【解决方案1】:

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

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

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

如果你使用 asp.net 网络服务器,你可以使用这个Request.UserHostAddress

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

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

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

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

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

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

【讨论】:

  • 它在本地机器上工作。
  • 我正在检查直到字符串为空,如果字符串有任何 mac aadrees 然后它将返回它
  • 它可以在您的本地机器上运行,因为客户端和服务器是同一台主机。此答案包含您唯一识别访问应用程序的客户所需的大部分内容。 MAC 做不到。
  • @kdmurray 好的,谢谢
猜你喜欢
  • 1970-01-01
  • 2012-10-16
  • 2015-12-19
  • 2023-03-15
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2017-08-05
相关资源
最近更新 更多