身份 2 的 OWIN - 避免定期访问数据库以获取常见对象

OWIN with Identity 2 - avoid regularly hitting the database for common objects

我刚刚冒险并开始学习授权用户进入 MVC 应用程序的 OWIN 风格。我遇到的一个问题是存储对象,因为从会话对象转移到声明中。

传统上我会做的是对用户进行身份验证,然后将用户对象存储在会话中。当您经常在整个应用程序中使用来自该对象的数据时,这很有用。

现在我已经使用身份转移到 OWIN,我改为将 UserId 存储为声明。我知道最好避免使用复杂的对象。

所以我发现我经常需要访问数据库才能根据 UserId 读取用户信息。

这是我阅读 UserId 声明的方式:

List<Claim> claims = HttpContext.Current.GetOwinContext().Authentication.User.Claims.ToList();
var ret = claims.FirstOrDefault(x => x.Type == StaffClaims.OrganisationId);

有什么办法可以避免每次都拿这个ID从数据库中读取相应的记录吗?我想实现类似将用户对象存储在内存中某处的目的。

或者,Entity Framework 6 是否允许缓存,这样我在重复相同查询时就不会访问数据库(除非我知道它已更改并且应该重新读取)?

首先,将用户对象存储在会话中是一个非常糟糕的主意。永远不要那样做。

其次,您不需要在声明中存储用户 ID;您可以随时使用 User.Identity.GetUserId().

获取它

第三,Entity Framework 确实利用了缓存,但不是我认为您可以依赖的方式。如果你想缓存一些东西,那么用 System.Runtime.Caching 明确地做。您还可以利用操作上的 OutputCache 属性来缓存呈现的视图,其副作用是不需要数据库调用来再次呈现它。

最后,这本来就没什么大不了的。只需在需要时获取用户即可。在您担心这个简单的查询之前,您的应用程序中可能还有 10,000 个其他区域,可以而且应该首先对其进行优化。