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

Asp.net mvc 存储用户上次登录信息的良好设计模式是什么?,asp.net-mvc,authentication,design-patterns,Asp.net Mvc,Authentication,Design Patterns,我正在设计一个功能,用于在ASP.Net(MVC)应用程序中存储上次登录日期/时间 我的第一反应是根据用户的配置文件记录将值存储在数据库中,并在成功登录时将值更新为当前日期/时间。当然,只要我记录了该值,所有页面都将显示此会话成功登录的日期和时间 计划B:记录上一个会话的字段和记录此会话的字段。登录时,将此会话的日期/时间保存到“当前”字段,并将以前在其中找到的值移动到“以前”字段(显然)。此字段提供我的“上次登录”值 这是最好的方法还是可以做得更优雅一些?还有其他几种方法可以做到这一点 您可以

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

我的第一反应是根据用户的配置文件记录将值存储在数据库中,并在成功登录时将值更新为当前日期/时间。当然,只要我记录了该值,所有页面都将显示此会话成功登录的日期和时间

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


这是最好的方法还是可以做得更优雅一些?

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

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

  • global.asax有一个Session_End事件(或类似事件)。当用户首次登录时,该值可以存储在会话变量中,然后当会话_End激发时,该值将写入数据库。这种方法可能会导致更多的奇怪现象,因为您总是想知道如果会话\u end没有启动,或者如果用户在第一次登录时启动会话\u end之前重新登录,会发生什么

  • 已经有一段时间了,但是asp.net允许您从基类继承一种中间件,并实现处理会话开始/结束之前或之后的代码。我已经有一段时间没有做ASP了,所以我对这个问题有点模糊


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

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

    但这取决于你的设置和应用程序,这对你来说是否可行

    更新

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


    如果身份验证票证的有效期长于会话,则使用cookie方法并将cookie的有效期设置为与身份验证票证的有效期相同

    创建一个实现此功能的自定义可序列化类怎么样

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


    我的第一个想法是简单地使用一个
    堆栈来实现这一点,但尽管它是可序列化的,但它没有提供能够自动收回旧值的钩子。

    Session\u end仅在proc中存储会话状态时才起作用。这是需要记住的。由于这个原因,我从不使用它。这将是我处理这个问题的方式,它只会保留客户的信息。如果用户在家和下班时登录,则信息将不正确。您需要在服务器上持久化此信息。这不需要在服务器上持久化,因为它在语义上是相同的。登录时,唯一有趣的信息是上一次登录,无论您采取何种方式,它始终存在。@Heiko Hatzfeld-我想您看错了。每次用户登录.@Phil.Wheeler时,每次登录的日期/时间都会保存到用户记录中-然后您只需使用cookie方法,cookie的到期日与身份验证票证的到期日相同。当它过期时,用户需要重新登录,从而创建一个新的上次登录日期/时间cookie。根据需要调整模式。为什么需要存储上一次和当前登录时间?@Charles Conway-只需要最后一次登录日期/时间,但会被当前登录日期/时间覆盖。它可用于诸如“用户上次登录时间为昨天11:52”或“自上次登录后的3个新项目”等功能