none
Configurar cookie de autenticación RRS feed

  • Pregunta

  • Hola. 

    Tengo la siguiente configuración de autenticación:

    services.AddAuthentication(options => {
    	options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    	options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
    {
    	options.Cookie.Name = "SGEApp";
    })
    .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
    {
    	options.Authority = "https://localhost:5001";   // Url del Identity Server
    	options.RequireHttpsMetadata = false;
    	options.ClientId = clientId;
    	options.ClientSecret = secretKey;
    	options.ResponseType = OpenIdConnectResponseType.Code;
    	options.SaveTokens = true;
    
    	options.UsePkce = true;
    	options.GetClaimsFromUserInfoEndpoint = true;
    
    	options.Scope.Add("openid");
    	options.Scope.Add("profile");
    
    	options.Scope.Add("offline_access");
    	options.Scope.Add("Api_1");
    });

    Quiero configurar el tiempo de expiración de la cookie de autenticación. He agregado lo siguiente:

    services.ConfigureApplicationCookie(options =>
    {
    	options.Cookie.HttpOnly = true;
    	options.ExpireTimeSpan = TimeSpan.FromMinutes(3);
    	options.SlidingExpiration = false;
    });

    Pero la cookie no expira a los 3 minutos,

    Saludos.

    jueves, 7 de enero de 2021 13:01

Respuestas

  • Hola. ExpireTimeSpan controla cuánto tiempo será válida el ticket de autenticación almacenado en la cookie, no la caducidad de la misma. Como estás usando IdentiyServer, en el momento en que hagas login debes establecer la caducidad de la cookie.

    Para ello en tu IdentiyServer deberías tener algo parecido a 

    services.ConfigureApplicationCookie(opt =>{
        opt.Events.OnSigningIn = async(signinContext)=>{
            signinContext.Properties.ExpiresUtc = DateTimeOffset.Now.AddMinutes(3);
            signinContext.CookieOptions.Expires = signinContext.Properties.ExpiresUtc?.ToUniversalTime();
        };
    });
    Básicamente la cookie la genera IdentiyServer y la devuelve a tu navegador. No es tu aplicación que consume IdentiyServer la que genera la cookie


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


    jueves, 7 de enero de 2021 23:24
    Moderador
  • Hola, te deja navegar porque la cookie propia de IdentiyServer no caduca

    Prueba a configurar esto en tu IdentiyServer

    services.AddIdentityServer(options =>
    {
        options.Authentication.CookieLifetime = TimeSpan.FromMinute(2);
    })


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

    sábado, 9 de enero de 2021 19:21
    Moderador

Todas las respuestas

  • Hola,

    Has probado solo con la opción,

    myCookie.Expires = now.AddMinutes(1);

    Saludos,

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    jueves, 7 de enero de 2021 15:11
    Moderador
  • Hola. ExpireTimeSpan controla cuánto tiempo será válida el ticket de autenticación almacenado en la cookie, no la caducidad de la misma. Como estás usando IdentiyServer, en el momento en que hagas login debes establecer la caducidad de la cookie.

    Para ello en tu IdentiyServer deberías tener algo parecido a 

    services.ConfigureApplicationCookie(opt =>{
        opt.Events.OnSigningIn = async(signinContext)=>{
            signinContext.Properties.ExpiresUtc = DateTimeOffset.Now.AddMinutes(3);
            signinContext.CookieOptions.Expires = signinContext.Properties.ExpiresUtc?.ToUniversalTime();
        };
    });
    Básicamente la cookie la genera IdentiyServer y la devuelve a tu navegador. No es tu aplicación que consume IdentiyServer la que genera la cookie


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


    jueves, 7 de enero de 2021 23:24
    Moderador
  • Hola.

    He retirado la configuración de cookie que tenía en el cliente y he agregado la siguiente configuración en el Identity Server:

    services.ConfigureApplicationCookie(options =>
    {
    	options.Events.OnSigningIn = (signinContext) =>
    	{
    		signinContext.Properties.ExpiresUtc = DateTimeOffset.Now.AddMinutes(2);
    		signinContext.CookieOptions.Expires = signinContext.Properties?.ExpiresUtc?.ToUniversalTime();
    
    		return Task.CompletedTask;
    	};
    });

    Pero la cookie sigue sin expirar. También probé con UtcNow y nada.

    viernes, 8 de enero de 2021 13:23
  • Hola. Pon un punto de parada dentro de ese código y verifica si se detiene. Por otro lado puedes mostrar el código cuando hacer login en tu IdentiyServer? Verifica también con las herramientas de desarrollo de tu navegador la fecha de caducidad de las cookies. Puedes decirnos las cookies que tienes?

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

    viernes, 8 de enero de 2021 13:45
    Moderador
  • Echa un ojo también aquí

    https://vxcompany.com/2018/12/13/cookies-tokens-and-session-lifetime-with-identity-server/


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

    viernes, 8 de enero de 2021 13:54
    Moderador
  • Hola Sergio,

    He revisado el enlace que proporcionas y he configurado el cliente de la siguiente manera:

    services.AddAuthentication(options => {
    	options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    	options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
    {
    	options.Cookie.Name = "SGEApp";
    
    	// Sesión deslizante
    	options.SlidingExpiration = true;
    
    	// Tiempo de inactividad en que caduca la sesión 
    	options.ExpireTimeSpan = TimeSpan.FromMinutes(1);
    })
    .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
    {
    	options.Authority = authority;   // Url del Identity Server
    	options.RequireHttpsMetadata = false;
    	options.ClientId = clientId;
    	options.ClientSecret = secretKey;
    	options.ResponseType = OpenIdConnectResponseType.Code;
    	options.SaveTokens = true;
    
    	options.UsePkce = true;
    	options.GetClaimsFromUserInfoEndpoint = true;
    
    	options.Scope.Add("openid");
    	options.Scope.Add("profile");
    
    	options.Scope.Add("offline_access"); 
    	options.Scope.Add("Api_1");
    
    	options.Events.OnTicketReceived = (context) =>
    	{
    		context.Properties.ExpiresUtc = DateTime.UtcNow.AddMinutes(2);
    
    		return Task.CompletedTask;
    	};
    });

    Observo que el delegado se ejecuta al iniciar sesión e imagino que la cookie está expirando a los 2 minutos porque dicho delegado se ejecuta a los 2 minutos de inactividad. El problema que tengo es que no está redireccionando al Login del IDP para que el usuario vuelva a ingresar sus credenciales sino que le permite navegar de normalmente.


    • Editado Ealdaz sábado, 9 de enero de 2021 13:16
    sábado, 9 de enero de 2021 13:15
  • Hola, te deja navegar porque la cookie propia de IdentiyServer no caduca

    Prueba a configurar esto en tu IdentiyServer

    services.AddIdentityServer(options =>
    {
        options.Authentication.CookieLifetime = TimeSpan.FromMinute(2);
    })


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

    sábado, 9 de enero de 2021 19:21
    Moderador