我在.net core 1.0中有一个Web API,该API在登录时向客户端发出JWT token (access_token)。现在, token 的有效期很短(10分钟),客户端每8分钟请求一个新 token 以保持 session 的连续性。该 token 存储在客户端浏览器的cookie中。
现在,如果客户端仅在浏览器的一个选项卡中运行,这将很好地工作。但是,如果客户端打开两个或多个选项卡,则会每8分钟向API发出一次新 token 的请求。这导致同一用户同时发出多个请求,我的应用程序为每个请求都发行了 token ,但是只有一个 token 存储在客户端Cookie中。但这会导致多个 token ,在整个生命周期中仅使用其中一个。

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

我该如何解决这种情况?我希望我的API对在多个标签中打开的每个用户仅颁发一个 token 。任何帮助表示赞赏。

最佳答案

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

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

我相信,您正在寻找的解决方案是节流限速。您可以将 token 发行端点限制为1request/sec/ip(实验并找到运行良好的速率)。想法是阻止来自同一IP的对新 token 发行的并发请求,并仅处理其中之一。您可以通过IISAttributes来实现。玩转,看看最适合您的。

关于c# - 如何使API每位用户仅发行一个 token (在多个标签中打开)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47285053/

10-12 12:57
查看更多