2013-02-17 15 views
6

Ich benutze ASP.NET MVC und möchte in der Lage sein, automatisch jemanden einzuloggen, wenn sie auf die Seite zurückkehren (genau wie diese Seite).Persistent Cookie-Ablauf auf Sitzung in asp.net mvc festgelegt?

Wenn ein Benutzer zum ersten Mal registriert oder einloggt mir das Cookie wie folgt festgelegt:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
    1, 
    "playerid", 
    DateTime.Now, 
    DateTime.Now.AddMinutes(1), //This will be set to a longer period in live... 
    true, 
    Username + "|" + item.PlayerID.ToString(), 
    FormsAuthentication.FormsCookiePath); 

string encTicket = FormsAuthentication.Encrypt(ticket); 
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket)); 

Wenn ich das testen, indem Sie sich als Benutzer anmelden und dann Blick auf den Cookies Registerkarte in Firebug dann dem Ablauf gesetzt zu Session. Wenn ich den Browser schließe und dann zu meiner Site zurückkehre, bin ich nicht mehr eingeloggt. Das würde ich erwarten, da die Sitzung endet, wenn der Browser geschlossen ist (aber das ist nicht das, was ich möchte!).

Allerdings, wenn ich mich einloggen und navigieren über die Website, dann nach Ablauf einer Minute verfällt der Ablauf nicht mehr als Session sondern erscheint als ein tatsächlicher Datumsstempel. Wenn ich dann den Browser schließen und auf meiner Seite zurück I Auto bin angemeldet.

Zusammenfassend scheint es, als ob mein Ablauf zu Session bis zum tatsächlichen Ablaufdatum gesetzt Ich habe Pässe festgelegt (t + 1 min in In diesem Fall) und ich war aktiv auf der Website (Ich verwende gleitende Ablaufzeit).

Irgendwelche Ideen, wie ich mein Ablaufdatum auf das festlegen kann, was ich im FormsAuthentication-Ticket angegeben habe (und nicht als Session angezeigt wird)?

Antwort

9

Sie sollten eine persistent cookie erstellen, die auf dem Client-Festplatte, indem Sie die Expires Eigenschaft gespeichert ist:

var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) 
{ 
    // setting the Expires property to the same value in the future 
    // as the forms authentication ticket validity 
    Expires = ticket.Expiration 
}; 
Response.Cookies.Add(cookie); 

Stellen Sie sicher, dass Sie für das Cookie den gleichen Ablauf Timeout festgelegt haben und die Formularauthentifizierungsticket. Nun, wenn Sie mit Firebug schauen, sehen Sie, dass das, wenn das Cookie emittiert wird die Expires Eigenschaft wird in der Zukunft eingestellt wird, die das Cookie persistent machen und überleben Browser startet:

Set-Cookie: ASPXAUTH=...; Expires=Tue, 15-Jan-2014 21:47:38 GMT; Path=/; HttpOnly 
+0

Wow! Das funktioniert perfekt. Ich liebe diese Seite! Danke Darin –

+0

Um den Unterschied zwischen Cookie und Ticket zu verstehen, lohnt sich ein kurzer Blick http://support.microsoft.com/kb/910443?wa=wsignin1.0 –

+0

Danke für den Link. Das hilft mir, es besser zu verstehen. –