c# - 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;
}
注意:如果有任何可能的方法来唯一标识用户机器。
解决方案
您的代码返回您自己的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、请求标头等)。
这完全取决于您的需求、可用的资源以及您想要的东西有多容易出错和安全。
推荐阅读
- c# - OnMarkerClick 事件多次触发
- c++ - 将 cpp_int 转换为二进制字符串
- excel - Excel VBA从内存中清除已删除的图表名称而不关闭
- apache-spark - 在 HIVE 中执行查询但看不到结果
- php - 在 id base codeigniter 上加载特定的 div
- android - 如何处理 MVVM 模式和数据绑定中的适配器行点击?
- algorithm - 在测验中做出所有可能的答案组合的算法
- typescript - TS2339:“元素”类型上不存在属性“msMatchesSelector”
- ios - 当我更改数据源中的项目数时,UIcollection 视图崩溃
- sed - sed命令将逗号分隔的字符串分成一定的长度