Asp.net core 在内存中存储JWT令牌是一种好的做法吗

Asp.net core 在内存中存储JWT令牌是一种好的做法吗,asp.net-core,jwt-auth,Asp.net Core,Jwt Auth,我编写了一个asp.NETCore3.0WebAPI,在这里我使用JWT令牌对用户进行身份验证。一旦用户获得令牌,他/她就可以使用它,直到到期 我所做的是,我还将该令牌在身份验证时存储在内存中,以获取其他最小细节,例如用户名、在生成的令牌和“令牌” 我的第一个问题是,这是一个好的做法吗?因为令牌是无状态的,因此可以避免服务器端维护令牌的麻烦 我的第二个问题是,如果这样做是可以接受的,那么一旦令牌过期,我如何从内存中删除该令牌信息 如果我没有将这个令牌存储在内存中,那么如何提取诸如“获取所有登录用

我编写了一个asp.NETCore3.0WebAPI,在这里我使用JWT令牌对用户进行身份验证。一旦用户获得令牌,他/她就可以使用它,直到到期

我所做的是,我还将该令牌在身份验证时存储在内存中,以获取其他最小细节,例如用户名、在生成的令牌和“令牌”

  • 我的第一个问题是,这是一个好的做法吗?因为令牌是无状态的,因此可以避免服务器端维护令牌的麻烦

  • 我的第二个问题是,如果这样做是可以接受的,那么一旦令牌过期,我如何从内存中删除该令牌信息

  • 如果我没有将这个令牌存储在内存中,那么如何提取诸如“获取所有登录用户的列表”之类的信息

  • 当你说“在内存中”时,这是指在客户机本地还是服务器中的某个地方?我假设你指的是他们使用的客户端

    我目前自己也在使用JWT,以下是我的建议:

    1) 将令牌保存在会话存储中。 2) 只需清空会话(或存储会话的任何位置)。 3) 如果你想访问它,你肯定需要把它存储在某个地方。但是,获取所有用户的列表听起来像是希望将数据放在后端。您可以在后端服务器上跟踪这些标记,但通常这些标记会被处理并持久化到数据库中。但即使在后端服务器上,您也可以使用一组客户端对象来跟踪哪些对象已登录(即哪些对象具有未过期的令牌)

    典型的做法是生成两个令牌(auth令牌和refresh令牌),然后在用户提交令牌进行身份验证时根据数据库检查它们

  • 是的,将JWT缓存在内存缓存中是一种很好的做法,比如Redis或简单的内存缓存。新创建的令牌缓存在内存中,缓存退出时间与令牌过期时间相同
  • 当一个验证令牌的请求进来时,它首先检查它是否存在于内存缓存中,如果不存在,它将被查找到像db这样的持久存储中
  • 当用户使令牌无效(即注销)时,应将其从缓存中删除,并将状态更新为在db中无效
  • 在分布式应用程序中,维护状态是一项挑战。因此,最好由redis支持单独的缓存层。通过这种方式,我们可以使应用程序保持无状态

    除了令牌过期时间之外,您可能还需要添加额外的验证检查,这取决于JWT的内容(aud声明、签名验证等)。 要回顾JWT令牌的内容,可以使用以下工具

    干杯,
    Lakshmanan

    Nope..in memory意味着我将它存储在服务器端(services.AddMemoryCache)。我的用户通常是3-4人(他们不是真正的用户,而是试图访问我的api的其他应用程序),因此所有登录用户/应用程序的列表不应该很长。@Samra那么这里发布的规则也适用。在前端保留一个副本,可以将它们作为类存储在后端。完成后清空空间,或者根据需要将其值设置为null。如果您不想使用DB进行扩展,这就足够了。将令牌保存在内存中违背了无状态的概念,并且没有任何方法可以以这种方式获取所有登录用户。您可以做的只是保存令牌的一小部分信息,就像内存中的UserId和expireDate一样。因此,每当您想登录时,用户都会从这个列表中读取。还有一个建议。不要将令牌保存在cookie中,将它们保存在会话存储中,因为它无法从javascript访问。@Mohammadniazmand,您可以将令牌存储为HttpOnly cookie,javascript也无法访问它。