在Asp.Net WebApi Core 2.0中获取客户端的唯一标识符?

Moh*_*yan 0 c# asp.net-core asp.net-core-webapi

我正在寻找
我测试过的WebApi Core 2.0中客户端的唯一标识符HttpContext.Connection.Id,它对于所有浏览器都是相同的!

[HttpGet]
public IActionResult GetConnectionId()
{
    return Ok(new
    {
        ConnectionId = HttpContext.Connection.Id
    });
}
Run Code Online (Sandbox Code Playgroud)

我还用虚拟机测试了它,对于所有客户端都是一样的
如何在 Asp.Net WebApi Core 2 中获取客户端的唯一标识符?

Chr*_*att 5

不存在“客户端的唯一标识符”这样的东西。HTTP 是无状态的。HTTP协议实际上就是故意这样设计的。任何客户端都应该能够与任何服务器进行通信,无论过去的通信如何。这使得诸如负载平衡、故障转移等概念成为可能。

会话、cookie 等内容已分层在 HTTP 协议之上,以实现某种形式的状态,但它们并不是协议的真正功能,而是服务器和客户端之间的合作成果。客户端和服务器都必须参与该过程才能实现状态。特别是,Cookie 使 Google、Facebook 等公司能够在不同网站之间跟踪用户。但是,正如您所正确指出的那样,cookie 与基于 REST 的 API 不兼容。

因此,您唯一的选择就是身份验证。通过强制客户端进行身份验证,您可以准确地了解客户端的身份并跟踪该客户端的活动。没有其他的就足够了。无法访问 MAC 地址等客户端详细信息,因为您只能访问客户端选择共享的内容,而这不是其中之一。即使是这样,它也可以被操纵。IP 地址曾经在某种程度上具有识别性,但在这个 WAP、代理、VPN 等的时代,单个 IP 可以由任意数量的唯一客户端使用。另外,IP 地址也可能被欺骗,因此即使您可以通过 IP 识别客户端,也不能确保您真正在与该客户端打交道。

您可以选择多种形式的身份验证。JWT(JavaScript Web Tokens)现在很流行,但您也可以轻松使用客户端身份验证、证书身份验证、OAuth、OpenID 等。要点是简单地强制客户端以某种形式进行身份验证。只有这样您才能识别客户。