2010-04-14 44 views
6

我不确定这是否是实现它的最佳方式,但我希望在当前用户的所有请求期间保持用户对象处于活动状态。从阅读几个资源,我了解到,你应该创建自己的原则,它拥有这一点。但我不想每个认证请求触发数据库。有关如何处理此问题的任何建议?缓存数据库请求是个好主意吗?在asp.net中设置当前用户mvc

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
     HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 

      User user; 
      using (HgDataContext hg = new HgDataContext()) 
      { 
       if (Session["user"] != null) 
       { 
        user = (from u in hg.Users where u.EmailAddress == authTicket.Name select u).Single(); 
       } else 
       { 
        user = Session["user"] as User; 
       } 
      } 
      var principal = new HgPrincipal(user); 
      Context.User = principal; 
     } 
    } 
+0

这个问题似乎还不清楚。你想要保持什么样的对象?在任何情况下,你的代码片段都不能保持任何对象的活着,所以这里似乎有错误。但是,如果不知道你想要达到什么目的,我什么都不能说。你能否详细说明一下? – 2010-04-19 12:07:46

+0

我尽量保持我的用户对象 – TomHastjarjanto 2010-04-21 19:30:17

回答

2

我现在正在使用以下缓存用户的代码,注意在更新后删除缓存!

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
     { 
      HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
      if (authCookie != null) 
      { 
       FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 

       User user; 
       Cache cache = HttpContext.Current.Cache; 
       using (HgDataContext hg = new HgDataContext()) 
       { 
        user = cache[authTicket.Name] as User; 
        if (user == null) 
        { 
         user = (from u in hg.Users where u.EmailAddress == authTicket.Name select u).Single(); 
         cache[authTicket.Name] = user; 
        } 
       } 
       var principal = new HgPrincipal(user); 
       Context.User = principal; 
      } 
     } 
0

创建自己的IPrincipal实现是实现它的最佳方式。只要刷新它就可以为用户缓存数据,这不是问题。通常只有用户自己有能力改变他的个人资料,所以不难做到。您可以在this blog post中看到更改当前用户的简单方法。

3

会话可能是做到这一点的适当方式,实际上是我倡导的Session的少数用法之一。

相关问题