Tengo una ASP.NET MVC 5 aplicación que utiliza ASP.NET Identity 2.1.0 para la autenticación de usuario.

Todo funcionó bien en el pasado, pero ahora me enteré de que la persistencia de las sesiones de usuario no funciona más. No puedo decir lo que el cambio se rompió esta, pero ha funcionado cuando he implementado Identidad (convertido en la aplicación de SimpleMembership) y este es mi lógica tengo en este momento:

var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, 
                                     model.RememberMe, shouldLockout: true);

SignInManager es mi ApplicationSignInManager basado en SignInManager<ApplicationUser, int> y model.RememberMe es true.

Y mi configuración:

app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = ApplicationCookieIdentityValidator.OnValidateIdentity(
                    validateInterval: TimeSpan.FromMinutes(0),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            }
    });
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));
app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

Todo funciona bien, excepto la persistencia de las sesiones de usuario. He comprobado las cookies devuelto por el servidor y el .AspNet.ApplicationCookie siempre es devuelto como «válida para la sesión actual» en lugar de una fecha en el futuro. Así que cuando cierre y vuelva a abrir el navegador necesito para iniciar la sesión de nuevo…

¿Alguien tiene una idea de por qué esto no está funcionando (ya)?

P. S.: he anular SignInAsync en mi ApplicationSignInManager porque hago un poco de lógica personalizada, pero yo aún marcada con el depurador y para la siguiente llamada:

await base.SignInAsync(user, isPersistent, rememberBrowser);

isPersistent es true, por lo que se debe crear un persisten cookie.

  • Sospecho validateInterval: TimeSpan.FromMinutes(0) puede causar esto. Porque en cada solicitud se regenera cookie y establece una nueva. Pruebe a establecer validateInterval a algo más de 0 y ver si funciona.
  • Gracias, eso era todo. Se que cambia con la V 2.1? Porque definitivamente trabajado en el principio (con V 2.0). De todos modos: puesto esto como una respuesta y yo la aceptaré. Ahora necesito encontrar lejos de todo esto, ya que necesito (porque de SSO) de validación en cada solicitud.
InformationsquelleAutor ChrFin | 2014-09-08

3 Comentarios

  1. 6

    Este es un error conocido en la Identidad y buscando en esta respuesta no es muy nuevo.

    Cuando cookie se regenera en cada solicitud, «IsPersisted» bandera no está establecida, cuando, incluso cuando fue puesta en el original de la cookie.

    Para evitar esto, usted necesita para implementar su propia versión de la cookie validador que se establece el indicador como se debe.

    Creo que tengo la solución para usted, pero no he compilado o probado – solamente una dirección general de a donde necesita ir. Ver este esencial para el código completo.

    Esto es sólo un SecurityStampValidator código tomado de decompiler. He agrega líneas 91-96. Básicamente creo que «IsPersistent» bandera de la anterior cookie y agregar a la nueva cookie, cuando se crea. Que no se hizo en la no-versión modificada.

    Y, a continuación, en su Auth.Config que hacer:

    Provider = new CookieAuthenticationProvider
                {
                    OnValidateIdentity = MySecurityStampValidator.OnValidateIdentity(
                        validateInterval: TimeSpan.FromMinutes(0),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }

    Tenga cuidado sin embargo, cuando la nueva versión es, comprobar si esto se ha solucionado, así que usted puede quitar el sucio revisión. Este problema es informó que ser fijo, pero poco después de v2.1 estaba fuera.

    • Muchas gracias. Como ya tengo mi propio validador (ver ApplicationCookieIdentityValidator en mi código) yo sólo tenía que añadir los cambios no demasiado -> trabajo!
    • Sí, me di cuenta de que el nombre es diferente de la norma. Me alegro de ayuda!
    • buen código! Parece que falta using Microsoft.Owin.Security; para acceder a la AuthenticationProperties tipo aunque
    • Esto funciona para mí stackoverflow.com/questions/31946582/…
    • un año? más como 4 años desde que mi respuesta. Identidad 2 no es desarrollado más, ¿qué esperas?
  2. 0

    Con el fin de mantener a un usuario loggedin en el cierre de navegador en Mvc Identidad. El código de abajo, es lo que funcionó para mí en el Inicio.Auth.cs de la clase.

    app.UseCookieAuthentication(new CookieAuthenticationOptions
                        { 
                            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                            SlidingExpiration = true,
                            CookieHttpOnly = false,
                            LoginPath = new PathString("/Account/Login"),
    
                            Provider = new CookieAuthenticationProvider
                            {  
                                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                                validateInterval: TimeSpan.FromMinutes(30),
    
                                    regenerateIdentity: (manager, user) => 
                                    user.GenerateUserIdentityAsync(manager)),
    
                                OnResponseSignIn = context => {
                                    context.Properties.IsPersistent = true; };
                                } 
            }

Dejar respuesta

Please enter your comment!
Please enter your name here