唯一标识向Web API发出请求的客户端的内容

What Uniquely Identifies a Client Making a Request to Web API?

本文关键字:请求 客户端 标识 Web API 唯一      更新时间:2023-09-26

假设我写了一段代码,对web api进行http调用,类似于:

$http.get('www.myapi.com/api/controller/endpoint').then(function(resp){...})

然后我把这个代码交给两个住在不同城市的人,他们从各自的房子(只是从一些浏览器)访问我的API。我的API可以从http请求中获得什么信息,使我能够区分调用它的人A和人B?IP是否始终可用?MAC地址是否可用?还有什么?

当调用我的API时,人A怎么能假装是人B?

此外,如果人C从他们自己的Web API(后端)调用我的Web API会怎样?会提供相同的信息吗?或者会有什么不同?

这是一个普遍的问题,但如果您想了解具体情况,让我们假设ASP.NET Web API 2正在接收http请求。

您描述的是对预身份验证的渴望。

IP将始终可用。您可以将服务仅限于这些IP范围。这不是进行身份验证的好方法。

试图绕过必须执行身份验证是不安全的。您应该使用正确的身份验证方法。将IP限制与其他方法相结合是可以的。

John Meyer的答案是本质上基于预共享令牌的用户身份验证。拥有一个有效的令牌就意味着要不断登录。与建立寿命有限的临时令牌的典型基于令牌的用户身份验证相比,令牌更容易被破坏。

如果您决定采用预共享令牌路由,请使用一种支持令牌随时间正确旋转或排列的方法,这样它就不会受到重放攻击。

对于这种情况,您的最佳选择是典型的基于会话令牌的用户身份验证。

如果您实际上对谁在使用您的服务不感兴趣,只是他们是唯一标识的,那么您可以通过所有客户端都应该自动尊重和支持的http Set-Cookie标头为每个用户安全地建立一个会话(或永久或任意生存期)cookie,然后将其用作跟踪方法。

我的团队通过要求在所有请求中包含一个标识头来实现这一点。这确实需要调用方进行一些自定义,但不一定要求用户登录。当然,恶意用户可能会更改标头的值,因此如果这些调用需要非常安全,则需要传统的身份验证。

您似乎对此感到非常困惑。您正在寻找的是所谓的身份验证。

当你标记C#时,我假设你正在用C#开发你的api。我建议查看Web Api。

目前有几种身份验证方法可用。如果您正在开发rest api,那么可以使用json-web令牌。

您可以通过http头获得许多关于客户端调用您的api的信息。

我认为您总是可以使用完全身份验证。我看到你希望使用一组半安全的端点,但我认为任何方法都不适合你。MAC、ip、用户代理、自定义字段——老实说,任何东西都可能被欺骗。使用无记名代币或会话代币是您在这里的唯一赌注。对于公共api,你可以根据ip限制用户请求,也可以尝试找出特定ip是否试图利用你,从而阻止它,但无论如何都不可能找到真正的身份。