2009-02-05 14 views
14

Mam standardowy projekt WWW ASP.NET MVC (RC Refresh) ze standardowym dostawcą członkostwa ASP.NET i kontrolerem konta zawartym w szablonie projektu ."Zapamiętaj mnie" z ASP.NET Uwierzytelnianie MVC nie działa

Po sprawdzeniu "Zapamiętaj mnie" w formularzu logowania, nadal nie jestem pamiętany przez stronę. (Firefox pamięta moją nazwę użytkownika i hasło, ale to, co spodziewałem się, było automatycznie logowane).

Czy muszę ustawić i sprawdzić ciasteczko ręcznie? Jeśli tak, jak najlepiej zrobić to?

Odpowiedz

17

Musisz przekazać wartość true/false do metody SetAuthCookie.

public ActionResult Login (string email, string password, bool rememberMe, string returnUrl) 
{ 

    // snip 

    FormsAuth.SetAuthCookie(username, rememberMe); // <- true/false 

    // snip 
} 

i upewnij się, że bool rememberMe odzwierciedla stan pola wyboru na stronie logowania.

+1

Zrobiłem to, ponieważ natychmiast po zalogowaniu się zamknę przeglądarkę, ponownie ją otworzę i przejdę do strony, natychmiast jestem zalogowany - nawet jeśli nie próbuję przeglądać stron, które wymagają ode mnie być. Czy tak to powinno być, czy też sprawiam, że będzie to dla mnie zbyt łatwe? –

+1

CreatePersistentCookie z SetAuthCookie powoduje, że plik cookie jest zapisywany w systemie użytkownika, który utrzymuje je w stanie zalogowania. Tak, tak właśnie działa ten parametr. Istnieją dwa inne elementy, które kontrolują logowanie, które są "Limit czasu sesji" i "Limit czasu autoryzacji". –

+0

Jeśli przekroczony zostanie limit czasu sesji, ale limit czasu autoryzacji nie został przekroczony, kiedy użytkownik wejdzie na stronę, czy będzie musiał zalogować się ponownie po pierwotnym zalogowaniu się, pamiętając o zaznaczeniu? – ajbeaven

3

Musisz wygenerować trwały plik cookie w metodzie sterownika, która obsługuje logowanie po zaznaczeniu pola Pamiętaj mnie. Jeśli używasz RedirectFromLoginPage, ustaw argument createPersistentCookie na true.

+0

Teraz utworzę plik cookie z następującym kodem. if (rememberMe) { HttpCookie cookie = FormsAuthentication.GetAuthCookie (userName, true); cookie.Expires = DateTime.Now.Add (new TimeSpan (30, 0, 0, 0)); Response.Cookies.Add (cookie); } Jak sprawdzić, czy istnieje ważny plik cookie z żądaniem? –

+0

Myślę, że jeśli otrzymasz prawidłowy plik cookie sesji, użytkownik zostanie ustawiony w HttpContext i nie zostanie skierowany do strony logowania przez AuthorizationAttribute. – tvanfosson

2

Te trzy metody pomogły mi zachować plik cookie.

Uwaga: jeśli użytkownik anuluje zaznaczenie opcji "Pamiętaj mnie", usuń plik cookie.

private const string RememberMeCookieName = "MyCookieName"; 



     private string CheckForCookieUserName() 
     { 
      string returnValue = string.Empty; 
      HttpCookie rememberMeUserNameCookie = Request.Cookies.Get(RememberMeCookieName); 
      if (null != rememberMeUserNameCookie) 
      { 
       /* Note, the browser only sends the name/value to the webserver, and not the expiration date */ 
       returnValue = rememberMeUserNameCookie.Value; 
      } 

      return returnValue; 
     } 

     private void CreateRememberMeCookie(string userName) 
     { 
      HttpCookie rememberMeCookie = new HttpCookie(RememberMeCookieName, userName); 
      rememberMeCookie.Expires = DateTime.MaxValue; 
      Response.SetCookie(rememberMeCookie); 
     } 

     private void RemoveRememberMeCookie() 
     { 
      /* k1ll the cookie ! */ 
      HttpCookie rememberMeUserNameCookie = Request.Cookies[RememberMeCookieName]; 
      if (null != rememberMeUserNameCookie) 
      { 
       Response.Cookies.Remove(RememberMeCookieName); 
       rememberMeUserNameCookie.Expires = DateTime.Now.AddYears(-1); 
       rememberMeUserNameCookie.Value = null; 
       Response.SetCookie(rememberMeUserNameCookie); 
      } 
     } 
Powiązane problemy