2009-08-17 21 views
8

HI¿Cómo mantengo a un usuario conectado durante 2 semanas?

Estoy usando asp.net mvc con membresía asp.net.

Quiero tener una casilla de verificación que si hace clic mantiene a los usuarios conectados durante 2 semanas (a menos que borren sus cookies).

así que sé es su

FormsAuthentication.SetAuthCookie (nombre de usuario, createPersistentCookie)

pero no sé cómo configurarlo para la retención de 2 semanas.

Reescribí la mayoría de las cosas de membresía. Entonces no uso cosas como Create() y VerifyUser().

+0

Ha condsidered marcar una respuesta como anwer aceptado? –

Respuesta

4

Puede establecer el tiempo de espera global de la sesión (el valor está en minutos) en web.config, por ej.

<system.web> 
    <authentication mode="Forms"> 
      <forms timeout="20160"/> 
    </authentication> 
</system.web> 

Esto será para todos los usuarios autenticados. Si desea utilizar la funcionalidad "Recordarme", deberá escribir su propio código para configurar la cookie/ticket. Algo como esto (tomado from here):

protected void Page_Load() 
{ 
    if (Request.Cookies["username"] == null || Request.Cookies["username"].Value.ToString().Trim() == "") 
    { 
     Login1.RememberMeSet = true; 
    } 
    else 
    { 
     Login1.UserName = Request.Cookies["username"].Value.ToString().Trim(); 
     Login1.RememberMeSet = true; 
    } 
} 
protected void RememberUserLogin() 
{ 
    // Check the remember option for login 

    if (Login1.RememberMeSet == true) 
    { 
     HttpCookie cookie = new HttpCookie("username"); 
     cookie.Value = Login1.UserName.Trim(); 
     cookie.Expires = DateTime.Now.AddHours(2); 

     HttpContext.Current.Response.AppendCookie(cookie); 
     Login1.RememberMeSet = true; 

    } 
    else if (Login1.RememberMeSet == false) 
    { 
     HttpContext.Current.Response.Cookies.Remove("username"); 
     Response.Cookies["username"].Expires = DateTime.Now; 
     Login1.RememberMeSet = false; 
    } 

} 
+1

pero ¿qué tal si no marcan la casilla? ¿No todos obtendrán esa configuración? – chobo2

+0

Sí, lo siento, leí mal su pregunta. Actualizaré mi respuesta para responder a su pregunta específica ... –

+0

Creo que si configuro las cosas como las que tiene en el archivo web.config pero inhabilito la expiración por deslizamiento, entonces obtendré lo que querer. – chobo2

16

Agregue una clave hash o una cadena aleatoria tanto a la cookie como a la base de datos (ambas con la misma clave). Si la cookie y el valor de la base de datos son los mismos, cuando el usuario inicie una nueva sesión, vuelva a iniciar sesión. Cuando el usuario llegue a las dos semanas, elimine la clave secreta de la base de datos utilizando un cronjob (Unix) o una tarea programada (Windows).

Advertencia: No confíe en la fecha de caducidad de la cookie, ya que las personas pueden hackear su navegador.
Regla: ¡NUNCA, SIEMPRE confía en CUALQUIERA de sus usuarios!

+0

¿Puede explicarnos por qué el hashing de la cadena aleatoria aumenta la seguridad de su solución? Si el hash de la cadena aleatoria se almacena tanto en la base de datos como en la cookie, ¿no es esto básicamente lo mismo que almacenar la cadena aleatoria tanto en la base de datos como en la cookie? – rinogo

+0

Estoy usando la clave hash y la cadena aleatoria sinonimia. –

2

Simplemente use una cookie simple con 2 semanas de fecha de vencimiento.

+2

De lejos, la forma más simple, pero también la más fácil de hackear. –

+0

Punto menor, pero no es una cookie de "sesión" si tiene una fecha de caducidad establecida. Es una cookie "permanente". – MrWhite

+0

@ w3d de acuerdo. Corregido –

Cuestiones relacionadas