我写了一个 asp.net core 3.0 Web api,我在其中使用JWT令牌来验证用户身份。用户获得令牌后,就可以使用令牌直到令牌过期。
我所做的是,我还在身份验证中将该令牌存储在内存中,以获取其他最小细节,例如用户名,在生成的令牌和“令牌”。
我的第一个问题是,这是一种好习惯吗?由于令牌是无状态的,因此可以节省服务器端的维护麻烦。
我的第二个问题是,如果这样做可以接受,那么一旦令牌过期,如何从内存中删除此令牌信息。
如果我不将该令牌存储在内存中,如何提取诸如“获取所有已登录用户的列表”之类的信息。
答案 0 :(得分:4)
在分布式应用程序中,维护状态是一个挑战。因此,最好使用由redis支持的单独的缓存层。这样,我们可以使应用程序保持无状态。
除了令牌到期时间外,您可能还想添加其他检查验证,具体取决于JWT的内容(声音声明,签名验证等)。 要回顾JWT令牌的内容,可以使用下面的工具
https://devtoolzone.com/decoder/jwt
干杯, 拉克希玛南
答案 1 :(得分:1)
当您说“在内存中”时,这是在客户端计算机上还是在服务器中的某处?我将假设您是指在客户端使用它们。
我目前正在自己使用JWT,所以这里是我的建议:
1)将令牌保存在会话存储中。 2)只需清空会话(或将其存储在任何地方)。 3)如果要访问它,则肯定需要将其存储在某个位置。但是,获取所有用户的列表听起来像是您想要后端上的数据。您可以在后端服务器上进行跟踪,但是通常这些令牌会被处理并保存到数据库中。但是,即使在后端服务器上,您也只能拥有一组Client对象,以跟踪哪些对象已登录(即哪些对象具有未过期的令牌)。
典型做法是先生成两个令牌(身份验证令牌和刷新令牌),然后在用户提交令牌进行身份验证时对照数据库检查它们。