我可以在ASP.NET中访问其他用户的会话吗?

时间:2014-12-26 19:34:41

标签: asp.net asp.net-mvc session

在ASP.NET MVC中,我在Session中保存了具有其权限的用户对象,因此我不必每次都去数据库。所以我使用Session作为缓存。例如:

用户登录时:

 User user = dbContext.Users.Include(u => u.Privileges).SingleOrDefault(u => u.UserId == userId)

 Session["CurrentUser"] = user;

当用户执行将来的请求时:

 public ActionResult CreateSomething() 
 {
     User user = Session["CurrentUser"];

     if (user == null) 
     {
          // Error: not logged in
     }

     if (!user.Privileges.Any(p => p.PrivilegeId == PrivilegesEnum.CreateSomething)) 
     {
          // Error: doesn't have privilege
     }

     ...
 }

正如您所看到的,“.Any(...)”将在内存中运行,这比访问数据库更快。

问题是其他用户可以撤销或添加已记录用户的权限,这些已登录的用户只有在下次登录时才会感知到这些更改。

 public ActionResult RevokePrivilege(long targetUserId, long privilegeId) 
 {
     ...

     targetUser.Privileges.Remove(privilege)
     dbContext.SaveChanges();

     // ... (*)
 }

问题是:我可以访问(*)中的其他会话,以便我也可以在内存中进行这些更改吗?

像(我在这里发明)

        foreach (var kvp in SessionDictionary.Where(kvp => kvp.Value.UserId == user.UserId).ToList())
        {
            SessionDictionary[kvp.Key]["CurrentUser"].Privileges.Remove(privilege);
        }

1 个答案:

答案 0 :(得分:0)

可能您可以访问其他会话,但这不太容易。

在会话中添加时间戳并让它重新加载数据库内容是很容易的 到期。如果会话数据超过15秒或者您设置的任何内容,这将允许您从数据库刷新会话数据。