none
Timeout de sesión no funciona RRS feed

  • Pregunta

  • Buenas,

    Tengo una aplicación MVC 5 en donde estoy utilizando AspNet Identity para autenticar. El formulario de Login se encuentra en la ruta /Account/Login y quisiera que la sesión expire al a los N minutos (este valor debe obtenerse desde la Base de Datos). He intentado de la siguiente manera:

    var result = await _signInManager.PasswordSignInAsync(vm.UserName, vm.Password, vm.RememberMe, shouldLockout: true);
    switch (result)
    {
    	case SignInStatus.Success:
    		HttpContext.Session.Timeout = 1; // Aquí establezco el tiempo en minutos
    
    		return RedirectToAction("Index", "Home", new { area = "" });
    		//return RedirectToLocal(returnUrl);
    	case SignInStatus.LockedOut:
    		return View("Lockout");
    	case SignInStatus.RequiresVerification:
    		return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = vm.RememberMe });
    	case SignInStatus.Failure:
    	default:
    		ModelState.AddModelError("", "Usuario o contraseña incorrecto.");
    	return View(vm);

    He colocado un minuto para pruebas pero la sesión nunca expira, he colocando un breakporint en el método Session_End del Global.asax pero nunca ingresa ahí.

    Favor si me orientan, muchas gracias.

    viernes, 22 de marzo de 2019 17:01

Respuestas

  • Hola, usando Asp. Net Identity la session se puede configurar en la cookie. Puedes mostrar tu código de Startup.Auth?

    public void ConfigureAuth(IAppBuilder app)
    {
        // Code removed for brevity.
    
        // Configure the sign in cookie
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                // Enables the application to validate the security stamp when the user logs in.
                // This is a security feature which is used when you change a password or add an external login to your account.  
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            },            
            SlidingExpiration = true, 
            ExpireTimeSpan = TimeSpan.FromMinutes(1) //Set the session timeout at here
        });            
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
    
        app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(1));
        app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);        
    }
    Fíjate en la línea de ExpireTimeSpan que se establece a un minuto


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta eduar2083 domingo, 24 de marzo de 2019 16:56
    sábado, 23 de marzo de 2019 14:27
    Moderador

Todas las respuestas

  • Hola, usando Asp. Net Identity la session se puede configurar en la cookie. Puedes mostrar tu código de Startup.Auth?

    public void ConfigureAuth(IAppBuilder app)
    {
        // Code removed for brevity.
    
        // Configure the sign in cookie
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                // Enables the application to validate the security stamp when the user logs in.
                // This is a security feature which is used when you change a password or add an external login to your account.  
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            },            
            SlidingExpiration = true, 
            ExpireTimeSpan = TimeSpan.FromMinutes(1) //Set the session timeout at here
        });            
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
    
        app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(1));
        app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);        
    }
    Fíjate en la línea de ExpireTimeSpan que se establece a un minuto


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta eduar2083 domingo, 24 de marzo de 2019 16:56
    sábado, 23 de marzo de 2019 14:27
    Moderador
  • Hola Sergio, gracias por responder. Copio el código como estaba la clase Startup

    public partial class Startup
    {
    	public static IDataProtectionProvider DataProtectionProvider { get; set; }
    
    	public void ConfigureAuth(IAppBuilder app)
    	{
    		// Configure the db context, user manager and signin manager to use a single instance per request
    		app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<UserManager>());
    
    		//app.CreatePerOwinContext<ContextoIdentity>(ContextoIdentity.Crear);
    
    		app.UseCookieAuthentication(new CookieAuthenticationOptions
    		{
    			AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    			LoginPath = new PathString("/Account/Login"),
    			Provider = new CookieAuthenticationProvider
    			{
    				OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<UserManager, User, int>(
    					validateInterval: TimeSpan.FromMinutes(),30
    					regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
    																   getUserIdCallback: (id) => (id.GetUserId<int>()))
    			}
    		});
    		app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
    
    		app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(30));
    
    		app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
    	}
    }

    Veo que no tenía configurada las propiedades SlidingExpirationExpireTimeSpan. La he configurado de la siguiente manera:

    public partial class Startup
    {
    	public static IDataProtectionProvider DataProtectionProvider { get; set; }
    
    	public void ConfigureAuth(IAppBuilder app)
    	{
    		// Configure the db context, user manager and signin manager to use a single instance per request
    		app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<UserManager>());
    
    		//app.CreatePerOwinContext<ContextoIdentity>(ContextoIdentity.Crear);
    
    		app.UseCookieAuthentication(new CookieAuthenticationOptions
    		{
    			AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    			//LoginPath = new PathString("/Account/Login"),
    			Provider = new CookieAuthenticationProvider
    			{
    				OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<UserManager, User, int>(
    					validateInterval: TimeSpan.FromMinutes(30),
    					regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
    																   getUserIdCallback: (id) => (id.GetUserId<int>()))
    			},
    			SlidingExpiration = true,
    			ExpireTimeSpan = TimeSpan.FromMinutes(1)
    		});
    		app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
    
    		app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(30));
    
    		app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
    	}
    }

    Y ahora si efectivamente la cookie de sesión expira al minuto. No he configurado la propiedad LoginPath porque los controladores están decorados con un atributo personalizado [Authorize] en el cual se valida si el usuario está logueado y se establece la redirección en caso haya expirado, por tanto creo no tendría caso que configure la propiedad LoginPath:

    Cómo lo haría en Net Core? ya que veo que el método UseCookieAuthentication de IApplicationBuilder está obsoleto.

    Muchas gracias, saludos.




    • Editado eduar2083 sábado, 23 de marzo de 2019 18:16
    sábado, 23 de marzo de 2019 18:11
  • Hola. Aquí tienes como hacerlo

    Usar autenticación de cookies sin ASP.NET Core Identity


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    sábado, 23 de marzo de 2019 21:44
    Moderador