在服务器上,我知道用户ID,在生成会话令牌时以及稍后在没有它的情况下重新创建ASP.NET会话时。
我需要的是相当于cookie的服务器。快速搜索“服务器端cookie”返回了几篇文章,其中一篇我显然是在1999年写的,所有文章归结为“使用数据库”。
所以...我可以使用数据库。我们有一个用户表,我可以添加一列。或者我可以创建另一个包含三列的表:UID,SessionToken和CreatedAt。
CreatedAt是一个日期时间,我可以从中确定令牌是否已过期以及何时可以使ASP.NET会话过期以强制重新登录。
我最终使用了这个变种。在我的特定情况下,使用UID,可以从用户表中获取凭据。所以我将令牌和创建时间放入Session,否则按上述步骤进行。当Session不包含令牌到期时间或令牌已过期时,我获取凭据并请求令牌然后更新令牌和到期。
所有这些都包含在异常处理程序中,该处理程序返回一个虚拟(无效)令牌,其最终结果与具有相同持久性的令牌相同。
您会注意到我没有使用持久表。这样,故障点更少,并且不依赖于编辑数据库模式的能力。在表中管理状态的成本至少与生成新令牌的成本一样高。