带有标识2的OWIN - 避免定期访问数据库中的常见对象

时间:2015-12-11 16:04:34

标签: asp.net-mvc-5 asp.net-identity claims-based-identity

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

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

现在我已经使用Identity转移到OWIN,而是将UserId存储为声明。我理解,最好避免使用复杂对象。

所以我发现我经常不得不点击数据库来读取基于UserId的用户信息。

以下是我阅读UserId声明的方法:

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

有没有办法可以避免每次使用此ID并从DB中读取相应的记录?我希望实现像将User对象存储在某个内存中的东西。

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

1 个答案:

答案 0 :(得分:2)

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

其次,您不需要将用户ID存储在声明中;你可以随时User.Identity.GetUserId()获得它。

第三,实体框架确实利用了缓存,但不是我认为它可以依赖的东西。如果要缓存某些内容,请使用System.Runtime.Caching显式执行。您还可以使用操作的OutputCache属性来缓存渲染视图,这样做的副作用是不需要数据库调用再次渲染它。

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