visual studio microsoft espaƱol descargar community asp.net-mvc asp.net-identity asp.net-core asp.net-core-mvc

asp.net-mvc - microsoft - visual studio installer



ASP.NET Core MVC: configuraciĆ³n de la caducidad de la cookie de identidad (6)

En mi aplicación ASP.NET Core MVC, el tiempo de vida de la cookie de autenticación se establece en ''Sesión'', por lo que dura hasta que cierre el navegador. Yo uso el esquema de autenticación predeterminado para MVC:

app.UseIdentity();

¿Cómo puedo prolongar la vida útil de la cookie?


El middleware de identidad de ASP.NET que está utilizando es un envolvente de algunas llamadas a UseCookieAuthentication que incluye el middleware de autenticación de cookies en la tubería. Esto se puede ver en el código fuente de las extensiones de constructor del middleware Identity aquí en GitHub . En ese caso, las opciones necesarias para configurar cómo debería funcionar la autenticación de cookie subyacente se encapsulan en IdentityOptions y se configuran al configurar la inyección de dependencia.

De hecho, mirando el código fuente al que te app.UseIdentity() puedes ver que se ejecuta lo siguiente cuando llamas a app.UseIdentity() :

var options = app.ApplicationServices.GetRequiredService<IOptions<IdentityOptions>>().Value; app.UseCookieAuthentication(options.Cookies.ExternalCookie); app.UseCookieAuthentication(options.Cookies.TwoFactorRememberMeCookie); app.UseCookieAuthentication(options.Cookies.TwoFactorUserIdCookie); app.UseCookieAuthentication(options.Cookies.ApplicationCookie); return app;

Para configurar la clase IdentityOptions , el AddIdentity<TUser, TRole> tiene una versión sobrecargada que permite configurar las opciones con un lambda. Por lo tanto, solo tienes que pasar un lambda para configurar las opciones. En ese caso, solo tiene que acceder a las propiedades de Cookies de la clase de opciones y configurar ApplicationCookie como desee. Para cambiar el lapso de tiempo que haces algo como

services.AddIdentity<ApplicationUser, IdentityRole>(options => { options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromHours(1); });

EDITAR: La propiedad ExpireTimeSpan solo se usa si al llamar a HttpContext.Authentication.SignInAsync pasamos una instancia de AuthenticationProperties con IsPersistent set a true .

Al probar solo con el software de autenticación de cookies, resulta que esto funciona: si simplemente iniciamos sesión sin esta opción, obtenemos una cookie que dura toda la sesión, si la enviamos juntas, obtenemos una cookie que dura lo que configuramos al configurar El middleware.

Con ASP.NET Identity, la forma de hacerlo es pasar el parámetro isPersistent of PasswordSignInAsync con el valor true . Esto termina siendo una llamada a SignInAsync del paso HttpContext en las AuthenticationProperties con el conjunto IsPersistent en verdadero. La llamada termina siendo algo así como:

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);

Donde el RememberMe es lo que configura si estamos configurando IsPersistent como verdadero o falso.


En ASP.NET Core 2.0 use la propiedad ExpireTimeSpan en lugar de Cookie.Expiration.

services.ConfigureApplicationCookie(options => { options.Cookie.Name = "CookieName"; options.ExpireTimeSpan = TimeSpan.FromHours(24); options.SlidingExpiration = true; });

De los docs :

Cookie.Expiration: Obtiene o establece la vida útil de una cookie. Actualmente, esta opción no funciona y quedará obsoleta en ASP.NET Core 2.1+. Utilice la opción ExpireTimeSpan para establecer la caducidad de las cookies.


Hay una respuesta para la versión 2.0 pero no funcionó para mí. Tenía que hacer:

services.ConfigureApplicationCookie(options => { options.ExpireTimeSpan = TimeSpan.FromDays(30); });

El valor predeterminado es 14 días.


Para ASP.NET Core 2.0

services.ConfigureApplicationCookie(options => { options.Cookie.Name = "CookieName"; options.Cookie.Expiration = TimeSpan.FromDays(2); });


Por alguna razón tuve el problema al usar SignInAsync([..], true) la cookie nunca se mostró en el navegador (y el inicio de sesión falló correctamente):

Entonces, intenté agregar la diferencia de zona horaria UTC en el TimeSpan de ExpireTimeSpan

services.AddIdentity<ApplicationUser, IdentityRole>(o => { // add TimeSpan with 5 minutes plus timezone difference from Utc time o.Cookies.ApplicationCookie.ExpireTimeSpan = DateTime.Now.Subtract(DateTime.UtcNow).Add( TimeSpan.FromMinutes(5) ); });

Voila! Funcionó y la cookie se muestra con + 5min de caducidad solo en el navegador.

PingBack a github.com https://github.com/aspnet/Identity/issues/766#issuecomment-253237576


Tratar

app.UseIdentity().UseCookieAuthentication( new CookieAuthenticationOptions { ExpireTimeSpan = TimeSpan.FromHours(1) } );