2010-04-14 28 views
6

Nie jestem pewien, czy jest to najlepszy sposób to zrobić, ale chcę zachować obiekt użytkownika przy wszystkich żądań bieżącego użytkownika. Odczytując kilka zasobów dowiedziałem się, że powinieneś stworzyć swoją własną Klienę, która to posiada. Ale nie chcę uruchamiać bazy danych dla każdego żądania uwierzytelnienia. Wszelkie zalecenia dotyczące sposobu radzenia sobie z tym? Czy buforowanie żądania db jest dobrym pomysłem?Ustaw bieżącego użytkownika w 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

Pytanie wydaje mi się niejasne. Jaki dokładnie obiekt chcesz zachować przy życiu? W każdym razie twój fragment kodu nie jest w stanie utrzymać żadnych obiektów przy życiu, więc wydaje się, że jest tam błąd. Ale nie wiedząc, co dokładnie chcesz osiągnąć, nie mogę powiedzieć nic więcej. Czy mógłbyś rozwinąć? –

+0

Próbuję zachować mój obiekt użytkownika wokół – TomHastjarjanto

Odpowiedz

2

Korzystam teraz z następującego kodu, który buforuje użytkownika, należy pamiętać o usunięciu pamięci podręcznej po aktualizacji!

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

Tworzenie własnych kroków jest najlepszym sposobem na zrobienie tego. Nie ma problemu z buforowaniem danych dla użytkownika, o ile odświeżysz go, jeśli zostanie zaktualizowany. Zwykle tylko sam użytkownik ma możliwość zmiany swoich danych osobowych, więc nie jest trudno to zrobić. Możesz zobaczyć łatwy sposób na zmianę bieżącego użytkownika w this blog post.

3

Sesja to prawdopodobnie odpowiedni sposób na zrobienie tego, a tak naprawdę jest to jedno z niewielu zastosowań Sesji, które popieram.

Powiązane problemy