2010-04-14 69 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的少數用法之一。

相關問題