Asp.net mvc 在请求之间持久化/缓存数据-常用方法

Asp.net mvc 在请求之间持久化/缓存数据-常用方法,asp.net-mvc,forms-authentication,persistence,user-data,Asp.net Mvc,Forms Authentication,Persistence,User Data,我正在开发一个Asp.net(MVC,但这并不重要)应用程序。我有一个自定义IHTTP模块,负责PostAuthenticateRequest以更改用户主体和标识 当用户登录时,我将用户ID和用户名存储在身份验证cookie中。我有一个IUser(由DAO和业务对象层实现,每个层都有自己的附加成员),我在所有业务服务类中都需要它。当用户需要任何东西时,我必须提供IUser对象实例(通常来自业务对象层),因此从身份验证票证提供ID是不够的 所以我在想,如何以及在哪里保存登录用户的IUser数据是最

我正在开发一个Asp.net(MVC,但这并不重要)应用程序。我有一个自定义IHTTP模块,负责PostAuthenticateRequest以更改用户主体和标识

当用户登录时,我将用户ID和用户名存储在身份验证cookie中。我有一个IUser(由DAO和业务对象层实现,每个层都有自己的附加成员),我在所有业务服务类中都需要它。当用户需要任何东西时,我必须提供IUser对象实例(通常来自业务对象层),因此从身份验证票证提供ID是不够的

所以我在想,如何以及在哪里保存登录用户的IUser数据是最好的

  • 我不想每次都从数据库中获取它(基于身份验证票证的用户ID数据)
  • 我无法将其存储在会话中,因为我必须在PostAuthenticateRequest中工作,因为会话尚未准备就绪
  • 我希望所有的功能都封装在我的自定义IHttpModule中
  • 我看到的选择:

    • 缓存
    • 饼干
    • (会话)-从PostAuthenticateRequest移动到PostAcquireRequestState事件并在那里更改主体/标识,但我希望避免这种情况
    使事情复杂化的过程包括:

  • 用户登录后,将从数据库中提取用户数据,并以某种方式保存以供以后的请求使用
  • 用户注销时,必须自动从持久介质中删除用户数据
  • 用户更改自己的配置文件时,必须丢弃用户数据,并在数据库发出下一个请求时重新读取
  • 我不希望所有这些都由HttpModule自动处理(如果可能的话),以消除开发人员忘记重置这些东西的错误

    我也不想写/读一些硬编码的变量/键,并在应用程序的其他部分操作它们。这只会带来技术债务

    问题

  • 你有什么建议
  • 如何在请求之间持久化用户数据

  • 考虑到您的需求,我认为最好的解决方案是从cookie中检索ID并使用它索引到Http缓存(HttpContext.Current.Cache)

    如果要维护用户访问缓存的方式,请将缓存包装在“UserCache”对象中。该对象可以由HttpModule构造,并作为(wait it…)单例存储在缓存本身中,或者更好的是,在需要从http缓存中提取时构造。这将取决于您需要访问它的位置以及HttpContext.Current.Cache是否直接可用。下面是延迟实现

    同样,这是为了清楚起见,而不是我实际如何实现它

    public class UserCache
    {
      public IUser GetUser(object userKey)
      {
        return HttpContext.Current.Cache[userKey];
      }
    
      public void AddUser(object userKey, IUser user)
      {
        /* this could pull the key from the user object as well. */
        HttpContext.Current.Cache.Add(/* add the object with key and a sliding expiration that is slightly greater than session timeout */);
      }
    
      public void ExpireUser(object userKey)
      {
        HttpContext.Current.Cache.Remove(userKey);
      }
    
      /* If you don't want to do SQL cache dependency */
      public void UpdateUser(object userKey, IUser user)
      {
        HttpContext.Current.Cache.Insert(/* ... */);
      }
    }
    
    使用默认的缓存机制(或者更好的是DI提供的缓存机制,这样您就不会被绑定到实现上),您可以设置一个过期时间来自动从缓存中删除用户,如注释中所述。您可以将缓存设置为依赖于SQL server更新来处理更新,也可以将其作为服务的一部分手动更新以保存更改

    有关默认缓存的更多信息可用。有关的详细信息,请参阅

    在HttpModule本身中,我想您可以在EndRequest事件中使用一些魔法来查看请求是否经过身份验证,然后根据cookie将用户注销,但我不确定这是否有效,因为我从未尝试过。您可能希望在1.1天内查看MSDN,看看它是否回答了您试图解决的一些问题

    至于SO体系结构以及它们是如何实现的,我可以想象它们会在需要时加载它,因为它们始终将大部分数据库保存在RAM中()