如何使每个用户只发出一个API(在多个标签中打开)?

时间:2017-11-14 11:48:15

标签: c# jquery .net-core jwt

我在.net core 1.0中有一个Web API,它在登录时向客户端发出JWT令牌(access_token)。现在,令牌有一个短的到期时间(10分钟),客户端每隔8分钟请求一个新的令牌,以保证会话的连续性。此令牌存储在客户端浏览器的cookie中。 现在,如果客户端仅在浏览器的一个选项卡中工作,则此工作正常。但是,如果客户端打开两个或多个选项卡,则每8分钟向API发出一个新令牌请求。这导致来自同一用户的多个请求同时发生,并且我的应用程序为每个请求发出令牌,但只有一个令牌存储在客户端cookie中。但它导致多个令牌,其中只有一个令牌在其整个生命周期中使用。

我已经尝试将userId和token存储在DB中并在API请求期间对它们进行交叉检查,但是,多个选项卡中的同一用户同时发出请求并且逻辑在这里失败。

我该如何解决这种情况?我希望我的API在多个选项卡中为每个用户只发出一个令牌。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

这很棘手。如果您尝试将令牌存储在数据库中,并且在旧的到期之前不发出新令牌,则会产生大量问题。想一想,当用户使用多个设备时。这种逻辑不起作用。还有更多的案例。

将JWT存储在服务器中是非常多余且反直觉的,IMO。 JWT的主要优点之一是每次请求受保护资源时都不必进行数据库调用。 JWT本身拥有授权用户的所有信息。

我相信,您正在寻找的解决方案是限制限速。您可以将令牌发布端点限制为1request / sec / ip(实验并找到效果良好的速率)。我们的想法是阻止来自同一IP的新令牌问题的并发请求,并仅处理其中一个。您可以通过IISAttributes来实现此目的。到处玩,看看哪种方式最适合你。