2010-03-16 22 views
12

Después de buscar mucho no obtuve ninguna respuesta y finalmente tuve que volver a contactarlo. A continuación estoy explicando mi problema en detalle. Es demasiado largo, así que por favor no dejes de leer. He explicado mi problema en un lenguaje simple.ASP.NET MVC RememberMe

He estado desarrollando un proyecto asp.net mvc. Estoy usando roles y membresía estándar de ASP.NET. Todo funciona bien, pero la funcionalidad para recordarme no funciona en absoluto. Estoy enumerando todos los detalles del trabajo. Espero que puedan ayudarme a resolver este problema.

Simplemente necesito esto:

necesito de usuario para iniciar sesión en la aplicación web. Durante el inicio de sesión, pueden iniciar sesión con recordarme o sin él. Si el usuario inicia sesión con recordarme, quiero que el navegador los recuerde durante mucho tiempo, digamos al menos un año o mucho tiempo. La forma en que lo hacen en www.dotnetspider.com, www.codeproject.com, www.daniweb.com y muchos otros sitios. Si el usuario inicia sesión sin recordarme, el navegador debe permitir el acceso al sitio web durante unos 20 -30 minutos y luego su sesión expirará. Su sesión también debe caducar cuando el usuario inicia sesión y cierra el navegador sin cerrar la sesión.

Nota: Implementé con éxito la funcionalidad anterior sin utilizar los roles y la membresía de asp.net estándar creando mis propios talbes para el usuario y autenticando en mi tabla de base de datos, estableciendo cookies y sesiones en mis otros proyectos. Pero para este proyecto, desde el principio usamos roles y membresía estándar de asp.net. Pensamos que funcionaría y que, una vez que todo se construyó en el momento de la prueba, simplemente no funcionó. y ahora no podemos reemplazar la funcionalidad existente con los roles y la membresía de asp.net estándar con mis propias tablas de usuario personalizadas y todas las cosas, usted entiende de lo que estoy hablando.

O hay algún tipo de error con los roles de asp.net estándar y la funcionalidad de membresía, o tengo todo el concepto de roles de asp.net estándar y membresía incorrecta. He declarado lo que quiero arriba. Creo que es muy simple y razonable.

lo que hice

  1. formulario de acceso con nombre de usuario, contraseña y me recuerdo campo.
  2. Mi configuración en web.config:
    autenticación
    < mode = "Forms" >
    < formas loginUrl = "~/Cuenta/inicio de sesión" timeout = "2880"/>
    </autenticación >

  3. en Mi acción del controlador, tengo esto:

    FormsAuth.SignIn (userName, rememberMe);

    public void SignIn (string userName, bool createPersistentCookie) { FormsAuthentication.SetAuthCookie (userName, createPersistentCookie); }

Ahora los problemas son los siguientes:

ya he dicho en la sección anterior "Simplemente necesito esto". usuario puede iniciar sesión correctamente en el sistema. Su sesión existe durante tantos minutos como se especifica en el valor de tiempo de espera en web.config. También he dado una muestra de mi web.config. En mi ejemplo, si configuro el tiempo de espera en 5 minutos, la sesión del usuario expira después de 5 minutos, está bien. Pero si el usuario cierra el navegador y vuelve a abrir el navegador, el usuario puede ingresar al sitio sin iniciar sesión hasta que el tiempo especificado en "tiempo de espera" no se haya agotado. La expiración deslizante para el valor de tiempo de espera también funciona bien. Ahora, si el usuario inicia sesión en el sistema con Remember me checked, la sesión del usuario aún expira después de 5 minutos. Esto no es un buen comportamiento, ¿verdad ?. Me refiero a decir que si el usuario inicia sesión en el sistema con recordarme revisado, debe recordarlo durante un tiempo prolongado hasta que no cierre sesión en el sistema o el usuario no elimine manualmente todas las cookies del navegador. Si el usuario inicia sesión en el sistema sin recordarme, su sesión caducará después de los valores del período de tiempo de espera especificados en web.config y también si los usuarios cierran el navegador. El problema es que si el usuario cierra el navegador y lo vuelve a abrir, aún puede ingresar al sitio web sin iniciar sesión.

Busco mucho en internet sobre este tema, pero no pude encontrar la solución. En la publicación del blog (http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx) hecha por Scott Gu sobre exactamente el mismo tema. Los usuarios se quejan de lo mismo en sus comentarios, pero no hay una solución fácil dada por el Sr. Scott.

lo leí en los lugares siguientes: http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx http://geekswithblogs.net/vivek/archive/2006/09/14/91191.aspx

supongo que esto es un problema de mucho de la de los usuarios. Como parece de la publicación del blog hecha por el Sr. Scott Gu.

Su ayuda será muy apreciada. Gracias de antemano.

+1

Lo sentimos, tldr. :) – kervin

+1

Tienes razón. Tu pregunta es demasiado larga. Deberías hacerlo más corto. –

+0

Por cierto, es el Sr. Scott Guthrie alias The Gu. –

Respuesta

26

Lo que quiere hacer es tener un tiempo de espera diferente cuando la opción RememberMe está marcada, que cuando está desmarcada. Lamentablemente, el método SetAuthCookie no le permite configurar la caducidad manualmente, por lo que tendrá que hacerlo usted mismo.

El problema es, entonces, ¿cómo hacer eso?

ASP.NET MVC utiliza la clase FormsAuthentication de System.Web.Security para hacer eso, porque no es trivial si también desea admitir la configuración y la navegación sin cookies y SSL, pero creo que si simplemente hace esto :

int timeout = rememberMe ? 525600 : 30; // Timeout in minutes, 525600 = 365 days. 
var ticket = new FormsAuthenticationTicket(userName, rememberMe, timeout); 
string encrypted = FormsAuthentication.Encrypt(ticket); 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted); 
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);// Not my line 
cookie.HttpOnly = true; // cookie not available in javascript. 
Response.Cookies.Add(cookie); 

... obtendrá una versión básica de lo que necesita.

NOTA: No probé este código.

+0

Dave, tu solución funcionó para mí. Pero hacer solo esto no es suficiente. Tuve que agregar una línea de código para recordarlo durante al menos un año. He escrito a continuación. – nccsbim071

+0

Gracias, acabo de actualizar. –

+0

Gracias, soluciona mi problema !! –

1

Eso no es un problema, es una característica :) sesión

del usuario no ha expirado aún así, incluso si se cierra y vuelve a abrir el navegador, la cookie sigue siendo buena.

Es la caducidad de la cookie que invalida la sesión del usuario.

+0

gracias kervin, estás en lo correcto. Esto despejó una de mis dudas. – nccsbim071

4

Kevin y Dave, chicos rock, hombre.

Dave, además de su código, tuve que agregar una línea más para hacerlo funcionar. Quiero recordarlo por al menos un año. Tuve que asignarle valor a la cookie. Extiende además de tu código para que funcione. Si esta línea cookie.Expires no está establecida, la cookie se pierde después de reiniciar la computadora, es decir, al final de la sesión. Me di cuenta de esto en FireFox. Pasé por los detalles de la cookie y encontré: si cookie.Expires no está configurado, el valor para el atributo "Expires:" en Firefox es "Al final de la sesión", pero si se establece cookie.Expires, el valor de "expira" : "atributo en Firefox es la fecha y hora en que se configuró la cookie.

Aquí está el código:

int timeout = createPersistentCookie ? 525600 : 2; // Timeout in minutes,525600 = 365 days 
var ticket = new FormsAuthenticationTicket(userName,createPersistentCookie,timeout);    
string encrypted = FormsAuthentication.Encrypt(ticket); 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted); 
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);//My Line 
HttpContext.Current.Response.Cookies.Add(cookie); 

Gracias chicos, que era realmente una gran solución.

0

Implementé lo mismo y cuando lo pruebo funciona bien en Mozila pero no funciona en IE8 para toda la PC, también tenía ajustes actualizados para aceptar cookies en IE pero aún no funcionaba.

Internet Explorer 8.x

  1. Haga clic en el menú Herramientas-.
  2. Seleccione Opciones de Internet en el menú - se abre una nueva ventana.
  3. Haga clic en la pestaña Privacidad, cerca de la parte superior de la ventana.
  4. Haga clic en el botón Predeterminado de la ventana.
  5. Mueva el control deslizante para que esté en uno de los niveles inferiores a Medio alto (incluido Medio, Bajo, Aceptar todas las cookies).
  6. Guarde los cambios haciendo clic en Aceptar.
  7. Ahora debería poder agregar artículos a su carrito de compras.
4

Solo una nota rápida sobre el uso del ticket de autenticación de membresía en un entorno compartido para cualquier persona que pueda aterrizar aquí con ese problema. Tengo un sitio de mvc en GoDaddy y tuve problemas para recordarme. Esta fue la solución:

<system.web> 
<machineKey 
    validationKey="4C6404A3B305CD6E8CFEAC258F042FB95E45E9C3C2CEC3AAB838996CFBE661E41DF1A1BAC75B9B45E02147612FD9B71CA74DDA50B0D0D6ED11F0BB8E31048953" 
    decryptionKey="BC471CF17A97B08A9DF85C7B502AD95680E3BE4418FD9C6CEA57E7F97ED64291" 
    validation="SHA1" decryption="AES" 
/> 

Gracias a: http://www.geekfreeq.com/aspnet-remember-me-option-forms-authentication-not-working/

+0

Aparentemente, ese vínculo ahora es una copia de seguridad. – ventaur

+3

Puede crear estas configuraciones aquí también http://aspnetresources.com/tools/machineKey – Gluip