我正在开发一个Asp.net (MVC,但这并不重要)应用程序。我有一个定制的IHttpModule,它负责PostAuthenticateRequest更改用户主体&标识。
当用户登录时,我将UserID和UserName存储在身份验证cookie中。我有一个IUser (由DAO和业务对象层实现,每个层都有自己的附加成员),这是我在整个业务服务类中都需要的。当用户需要任何东西时,我必须提供IUser对象实例(通常来自业务对象层),因此从auth票据提供ID是不够的。
因此,我在考虑如何以及在哪里最好地保存用户的IUser数据?
我看到的选择:
似乎使事情复杂化的过程是:
我不希望所有这些都由HttpModule自动处理(如果可能的话),以消除开发人员忘记重置这些东西的错误。
我也不想写/读一些硬编码的变量/键,并在应用程序的其他部分对它们进行操作。这只会带来技术债务。
问题
发布于 2009-08-12 03:23:09
考虑到您的需求,我认为最好的解决方案是从cookie中检索ID,并使用它索引到Http (HttpContext.Current.Cache)。
如果要维护用户访问缓存的方式,请将缓存包装在"UserCache“对象中。对象可以由HttpModule构造并存储为(等待.)在缓存本身内的singleton,或者更好的是,只是在需要从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登录用户,但我不确定这是否有效,因为我从未尝试过。您可能希望查看一下MSDN上的这篇文章,追溯到1.1天前,看看它是否解决了一些您想要解决的问题。
至于SO体系结构以及它们是如何实现的,我可以想象它们在需要时加载它,因为它们总是将大部分数据库保存在内存中(http://highscalability.com/stack-overflow-architecture)。
https://stackoverflow.com/questions/1263580
复制相似问题