2009-11-16 6 views
1

que je fais ce qui suit lors de la connexion, mais les connexions ne semblent pas être persistant du tout:créer un cookie persisté avec forumsauthentication

FormsAuthentication.SetAuthCookie(userId.ToString(), true); 
+0

Quelle est votre forme d'authentification délai fixé dans votre web.config? L'ID utilisateur est-il également conservé dans Session ou tout autre mécanisme de stockage persistant? –

+0

yes timeout est défini sur 30. aucun autre stockage persistant n'est utilisé. – mrblah

+0

pouvez-vous coller votre section de votre web.config? De plus, n'oubliez pas de vérifier que votre navigateur n'est pas configuré pour effacer les cookies à chaque fois qu'il se ferme. –

Répondre

2

Vous avez rencontré un bug qui MS appelle une fonction de sécurité sans papier .

Pour définir un cookie persistant, vous devez le créer vous-même et définir explicitement l'expiration. La seule astuce consiste à obtenir la valeur de délai d'expiration FormsAuthentication, qui, dans leur sagesse infinie, Microsoft n'a pas exposé depuis 1.0. J'ai fourni ma méthode pour obtenir cette valeur.

Voici un exemple de travail.

Login.aspx

<%@ Page Language="C#" %> 

<script runat="server"> 

    protected void Login1_LoggedIn(object sender, EventArgs e) 
    { 
     var login = (Login)sender ; 

     if (login.RememberMeSet) 
     { 
      // hack to get forms timeout - it is not publicly surfaced anywhere. 
      var tmpTicket = FormsAuthentication.GetAuthCookie("foo", true); 
      var timeout = tmpTicket.Expires; 

      // create a new ticket 
      FormsAuthenticationTicket ticket = 
      new FormsAuthenticationTicket(2, login.UserName, DateTime.Now, timeout, true, "", FormsAuthentication.FormsCookiePath); 


      string ticketEncrypted = FormsAuthentication.Encrypt(ticket); 

      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, ticketEncrypted) 
      { 
       HttpOnly = true, 
       Path = FormsAuthentication.FormsCookiePath, 
       Secure = FormsAuthentication.RequireSSL, 
       Expires = ticket.Expiration 
      }; 

      Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 
      Response.Cookies.Add(cookie); 
     } 
    } 

</script> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Login ID="Login1" runat="server" OnLoggedIn="Login1_LoggedIn"> 
     </asp:Login> 
    </div> 
    </form> 
</body> 
</html> 
Questions connexes