我刚刚开始学习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是否允许缓存,以便在重复相同的查询时不会访问数据库(除非我知道它已经更改并且应该重新读取)?
答案 0 :(得分:2)
首先,将用户对象存储在会话中是一个非常糟糕的主意。不要那样做。
其次,您不需要将用户ID存储在声明中;你可以随时User.Identity.GetUserId()
获得它。
第三,实体框架确实利用了缓存,但不是我认为它可以依赖的东西。如果要缓存某些内容,请使用System.Runtime.Caching
显式执行。您还可以使用操作的OutputCache
属性来缓存渲染视图,这样做的副作用是不需要数据库调用再次渲染它。
最后,这首先不是什么大问题。只需在需要时获取用户即可。在您担心这个简单的查询之前,您的应用程序可能还有10,000个其他区域,可以而且应该先进行优化。