Pregunta

Deseo tener una funcionalidad en mi aplicación que permita a un usuario marcar que desea permanecer registrado indefinidamente (establecer arbitrariamente la caducidad de la cookie en 3 meses a partir de AHORA).

El código que tengo para lidiar con esto es

private static HttpCookie GetFormsAuthenticationCookie(string userNameResponse, 
                                                        bool persistCookie)
{            
    var cookie = FormsAuthentication.GetAuthCookie(userNameResponse, persistCookie);

    if (persistCookie)
        cookie.Expires = DateTime.Now.AddMonths(3);

    return cookie;
}

private void LoginUser(string userNameResponse, bool PersistCookie)
{
    Response.Cookies.Add(GetFormsAuthenticationCookie(userNameResponse, PersistCookie));

    string navigateAfterUrl = FormsAuthentication.GetRedirectUrl(userNameResponse,
                                                                 PersistCookie);

    Response.Redirect(navigateAfterUrl);
}

Sin embargo, en algún momento más tarde, cuando regrese al sitio, necesito iniciar sesión nuevamente. He verificado que la cookie regresa con mi fecha de vencimiento y que no está configurada como una cookie de sesión (también se prueba con el cierre / reapertura del navegador y la cookie aún existe). Mi único pensamiento es que tiene algo que ver con cuando ASP.NET expira la sesión.

Tengo una configuración de clave de máquina específica en mi web.config, ¿no debería funcionar la misma cookie si se reinicia IIS, etc.? ¿Alguien tiene alguna sugerencia sobre lo que podría estar causando esto o al menos sobre cómo rastrear esto más, ya que no se me ocurre nada más que hacer.

¿Fue útil?

Solución

Cuando llama al método GetAuthCookie a FormsAuthenticationTicket se crea con un tiempo de espera dado por Propiedad Timeout en web.config. Así que asegúrese de configurarlo correctamente:

<authentication mode="Forms">
  <forms
    loginUrl="/someloginUrl"
    requireSSL="true"
    protection="All"
    // This is the setting you are looking for! (it's in seconds)
    timeout="120"
    domain="example.com"
    slidingExpiration="false"
    name="cookieName" />
</authentication>

Una vez que el ticket está encriptado, se utiliza como un valor para la cookie. Cuando configura la expira propiedad de su cookie a un valor dado, esto indica que se mantendrá en la computadora del cliente durante el período dado. Luego, en cada solicitud, el tiempo de ejecución de ASP.NET verificará la presencia de la cookie, intentará descifrar el valor y obtener el ticket. A continuación, comprobará si el ticket sigue siendo válido utilizando la propiedad Timeout, por lo que si tiene un pequeño tiempo de espera, no importa que su cookie aún se transmita, el ticket ya no es válido y la autenticación fallará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top