2009-02-05 10 views
14

Ich habe ein Standard ASP.NET MVC (RC Refresh) Webprojekt, mit dem Standard-ASP.NET-Mitgliedschaftsanbieter und der Account-Controller, der in der Projektvorlage enthalten ist ."Remember me" mit ASP.NET MVC Authentifizierung funktioniert nicht

Wenn ich in meinem Login-Formular "Remember me" ankreuze, werde ich immer noch nicht von der Seite erinnert. (Firefox merkt sich meinen Benutzernamen und mein Passwort, aber was ich erwartet habe, war, dass ich mich automatisch anmeldete).

Muss ich den Cookie manuell setzen und überprüfen? Wenn ja, wie sollte es am besten gemacht werden?

Antwort

17

Sie müssen True/False an die SetAuthCookie-Methode übergeben.

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

    // snip 

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

    // snip 
} 

und stellen Sie sicher, dass bool rememberMe den Status der Checkbox auf Ihre Login-Seite reflektiert.

+1

Ich tat dies, mit dem sofortigen Effekt, dass, wenn ich mich einlogge, den Browser schließe, ihn wieder öffne und zur Seite blicke, bin ich sofort wieder eingeloggt - selbst wenn ich nicht versuche, Seiten zu sehen, die mich dazu zwingen Sein. Ist das so, wie es sein soll, oder mache ich es mir zu leicht? –

+1

Der createPersistentCookie von SetAuthCookie verursacht, dass ein Cookie auf dem System des Benutzers gespeichert wird, das sie angemeldet hält. Also ja, das ist, was dieser Parameter tut. Es gibt zwei andere Elemente, die Logins steuern, die "Session Timeout" und "Authorization Timeout" sind. –

+0

Wenn das Sitzungszeitlimit auftritt, aber das Autorisierungstimeout nicht erfolgt ist, wenn der Benutzer zur Site geht, müssen sie sich erneut anmelden, nachdem sie sich ursprünglich mit remember me checked angemeldet haben? – ajbeaven

3

Sie müssen in der Controller-Methode, die die Anmeldung steuert, ein persistentes Cookie generieren, wenn das Kontrollkästchen Remember Me aktiviert ist. Wenn Sie RedirectFromLoginPage verwenden, setzen Sie das createPersistentCookie-Argument auf true.

+0

Ich erstelle jetzt das Cookie mit dem folgenden Code. if (rememberMe) { HttpCookie-Cookie = FormsAuthentication.GetAuthCookie (Benutzername, true); cookie.Expires = DateTime.Now.Add (neuer TimeSpan (30, 0, 0, 0)); Response.Cookies.Add (Cookie); } Wie überprüfe ich, ob es einen gültigen Cookie mit der Anfrage gibt? –

+0

Ich denke, wenn Sie einen gültigen Sitzungscookie erhalten, wird der Benutzer in den HttpContext festgelegt und sie werden nicht von AuthorizationAttribute auf Ihre Anmeldeseite geleitet. – tvanfosson

2

Diese 3 Methoden halfen mir, einen Cookie zu erhalten.

Hinweis: Wenn der Benutzer "Remember Me" nicht auswählt, sollten Sie den Cookie entfernen.

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); 
      } 
     } 
Verwandte Themen