configurar cookie para caducar al final de la sesión? asp.net

Me sorprende que no haya encontrado ninguna respuesta.

¿Cómo configuro mi sessionid en mi cookie para que expire al final de la sesión? (cuando el navegador se cierra o el usuario ha estado inactivo por un período de tiempo).

Las dos soluciones que encontré fueron

(httpcookie).Expires = HttpContext.Current.Session.Timeout 

Lo que me dio un error de comstackción, así que no sé si el usuario verificó su código antes de publicarlo. Y el otro fue establecer la fecha de caducidad hace 1 día, lo que mi instinto me dice que está mal. ¿Cómo hago esto?

Estás hablando de una cookie no persistente. Por defecto asp.net envía cookies de esa manera. La principal diferencia entre ellos es que una cookie persistente tiene un valor de caducidad establecido.

Entonces, si no desea que la cookie persista, entonces no configure el valor de expiración.

Dicho esto, la cookie permanecerá en la memoria hasta que el navegador esté cerrado. Digamos que navegan a su sitio y configura una cookie no persistente. Hacen cosas y navegan lejos. Más tarde, utilizando la misma instancia del navegador, vuelven a su sitio. La cookie todavía estará allí.

Ahora, si cerraron el navegador en algún momento, la cookie se vació.

El punto es, no establecer el encabezado caduca. Especialmente cuando la fecha de la sesión expira. Por lo general, las fechas de la sesión son de solo 20 minutos en el futuro, pero la fecha de caducidad avanza a medida que el usuario navega por su sitio.

===== actualización =====

Usé el siguiente código para probar:

  protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { HttpCookie c = Request.Cookies["test"]; if (c != null) { Response.Write(String.Format("test value is {0} 
", c.Value)); } } else { HttpCookie c = new HttpCookie("test"); c.Value = "HERE IT IS"; Response.Cookies.Add(c); } } protected void Button1_Click(object sender, EventArgs e) { Response.Write("clicked
"); }

el archivo .aspx simple tenía un botón que disparaba ese controlador button1_click. Cuando inicialmente lo busco usando cualquiera de los navegadores más recientes (es decir, firefox, chrome) no hay cookies. Después de hacer clic en el botón, se establece una cookie. Luego cerré completamente el navegador, volví a abrir y volví al sitio. En todos los casos, la cookie se había ido.

Es importante tener en cuenta que actualmente no puede contar con que se elimine una cookie de sesión cuando el usuario cierra el navegador. Tanto Chrome como Firefox hicieron ese cambio en 2012, más o menos; consulta los diversos enlaces en esta respuesta .

Ahora, no borrar las cookies de sesión me parece un agujero de seguridad terrible, horrible, no bueno, muy malo, sin mencionar una violación de cada RFC relevante, pero aparentemente nuestros Overlords de Google (y Mozilla) saben mejor.

No estoy seguro de cuál es la mejor solución, pero el enfoque que estoy tomando es restablecer la propiedad “Caduca” en la cookie a una hora en el futuro después de cada llamada. Ese no es precisamente el comportamiento deseado, pero creo que es mejor que permitir que las cookies cruciales permanezcan básicamente para siempre.

Abierto a otras sugerencias o aclaraciones.

TimeOut devuelve un int , Expires espera DateTime , por lo que ese código no se comstackrá. Establecer la fecha de caducidad hasta la fecha en el pasado inmediatamente revoca la cookie, por lo que probablemente no sea lo que desea. Si dejó la fecha de caducidad sin usar, la cookie expirará tan pronto como el usuario cierre el navegador.

Si desea que la cookie esté vinculada a la sesión en particular, ¿por qué involucrar a la cookie en primer lugar? Desde luego, podría seguir ampliando la fecha de caducidad de la cookie cada vez que el usuario extendió la sesión mediante el uso de su aplicación, pero eso parece un trabajo innecesario. Solo usa Session.

Siéntete libre de explicar el problema.

NO use el control de inicio de sesión, lo hace más difícil.

 protected void btnLogin_Click(object sender, EventArgs e) { // Check user and password in database bool isValidUser = ValidateUser(txtUsername.Text, txtPassword.Text); // Set cookie to be not persistent - this means if the user closes the browser, //autentification cookie will be deleted and the user is not longer logged bool isPersistentCookie = false; // Login user with the new username FormsAuthentication.SetAuthCookie(txtUsername.Text, isPersistentCookie); }