存储用户上次登录信息的好设计模式是什么?

时间:2009-09-13 09:34:23

标签: asp.net-mvc authentication design-patterns

我正在设计一个功能,用于在ASP.Net(MVC)应用程序中存储上次登录日期/时间。

我的第一直觉是根据用户的个人资料记录将值存储在数据库中,并在成功登录时将值更新为当前日期/时间。当然,只要我记录该值,所有页面都会显示会话成功登录的日期和时间。

计划B:记录上一个会话的字段和记录此会话的字段。登录时,将此会话的日期/时间保存到“当前”字段,并将先前在此处找到的值移动到“上一个”字段中(显然)。正是这个字段提供了我“最后登录”的值。

这是最好的方法还是可以更优雅地完成?

3 个答案:

答案 0 :(得分:5)

另一种方法是,在登录时,从用户记录中读取上次登录日期/时间并将其保存到会话或会话cookie中。然后使用当前日期/时间更新用户记录。然后在您的页面上读取存储在会话/ cookie中的值。

会话到期时将删除旧时间,这通常是用户需要重新登录的时间。它还具有速度和缓存的优势,因为它是从会话/ cookie中读取的。

但这取决于您的设置和应用程序是否可以为您服务。

<强>更新

只是要清楚......每次用户登录时,当前日期/时间都会持久保存到数据库用户表中。但在将日期/时间写入用户表之前,会读取现有值并将其保存到会话或cookie。然后,使用当前时间戳更新用户表中的日期/时间值。

如果您的身份验证票证持续时间超过会话,则使用cookie方法并将cookie的到期时间设置为身份验证票证的相同到期日期。

答案 1 :(得分:1)

还有其他几种方法可以做到这一点......

  1. 您可以使用一个单独的表来记录每个人的登录,而不是在用户记录上有一列。如果查看上次登录日期很重要,或者保留登录数据的统计信息以便稍后进行报告,这还可以让您能够“显示最后5次登录”功能。 (这会随着时间的推移积累数据,可能需要某种清理例程或计划脚本。)

  2. global.asax有一个Session_End事件(或类似的东西)。当用户第一次登录时,该值可以存储在会话变量中,然后当Session_End触发时将其写入数据库。这种方法可能最终导致比它的价值更多的奇怪,因为你总是想知道如果Session_End没有触发会发生什么,或者如果用户在第一次登录时解雇Session_End之前重新登录。

  3. 已经有一段时间了,但是有一种中间件,asp.net允许你从基类继承并实现处理会话开始/结束前或后的代码。我有一段时间没有做ASP,所以我对此很朦胧。

答案 2 :(得分:0)

如何创建实现此功能的自定义可序列化类?

这样的类可以简单地序列化/反序列化为用户配置文件的blob。除非您需要能够查询上次登录日期,否则这可能是一个很好的解决方案。

我的第一个想法是简单地使用Stack<T>来实现它,但是虽然它是可序列化的,但它没有提供会自动驱逐旧值的钩子。