c# - Cómo configurar las cookies de identidad asp.net caduca el tiempo
asp.net-identity (4)
Basada en la respuesta de @tmg, la siguiente solución funciona a la perfección simplemente usando la [HttpPost]Login()
:
await SignInManager.PasswordSignInAsync(userName: model.Email, password: model.Password, isPersistent: !model.RememberMe, shouldLockout: true);
donde es isPersistent: !model.RememberMe
(¡note lo contrario !
) da, como es de esperar ,
expiration date = Session
si el usuario elige RememberMe = true
expiration date = ExpireTimeSpan
(por ejemplo, 15 min) si el usuario elige RememberMe = false
Uso Asp.Net Identity para controlar la autorización de mi aplicación. Ahora, necesito hacer esto: si el usuario no opera en 30 minutos, vaya a la página de inicio de sesión, cuando el inicio de sesión no seleccione la casilla de verificación "Es persistente". Y, si seleccionó la casilla de verificación "Es persistente", establezca la fecha de caducidad de la cookie en 14 días. Intento hacer esto cambiando el Startup.Auth.cs de esta manera:
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
SlidingExpiration = true,
CookieName = WebHelpers.ConstStrings.AUTHCOOKIESNAME
});
}
y el código de inicio de sesión como este:
private async Task SignInAsync(User user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
if (isPersistent)
{
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}
else
{
AuthenticationManager.SignIn(new AuthenticationProperties() { ExpiresUtc = new DateTimeOffset(DateTime.UtcNow.AddMinutes(30)) }, identity);
}
}
Pero encontré que cuando el usuario no elige la casilla de verificación Persistente, la fecha de caducidad de las cookies ya es "Sesión", no la hora actual más 30 minutos.
El estado de las cookies cuando se usa el código como después, por lo que la casilla de verificación "Recordarme" no funciona. :(.
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromMinutes(30),
SlidingExpiration = true,
CookieName = WebHelpers.ConstStrings.AUTHCOOKIESNAME
});
Si la propiedad IsPersistent
de AuthenticationProperties
se establece en falso, la hora de caducidad de la cookie se establece en Sesión.
Si la casilla de verificación "Recordarme" está marcada, entonces AuthenticationManager.SignIn(new AuthenticationProperties{ IsPersistent = true }, userIdentity);
creará una cookie con un tiempo de caducidad igual a ExpireTimeSpan
que configuró en Startup.cs
(predeterminado a 14 días).
Si la casilla de verificación "Recordarme" NO está marcada, entonces tiene que usar AuthenticationManager.SignIn(new AuthenticationProperties{ IsPersistent = true, ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30)}, userIdentity);
. Nuevamente, IsPersistent
se establece en verdadero, pero ahora le damos un valor a ExpiresUtc, por lo que no se usa desde CookieAuthenticationOptions
de Startup.cs
.
public override async Task SignInAsync(ApplicationUser user, bool isPersistent, bool rememberBrowser)
{
var userIdentity = await CreateUserIdentityAsync(user).WithCurrentCulture();
// Clear any partial cookies from external or two factor partial sign ins
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.TwoFactorCookie);
if (rememberBrowser)
{
var rememberBrowserIdentity = AuthenticationManager.CreateTwoFactorRememberBrowserIdentity(ConvertIdToString(user.Id));
AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, userIdentity, rememberBrowserIdentity);
}
else
{
//AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, userIdentity);
if (isPersistent)
{
AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = true }, userIdentity);
}
else
{
AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = true, ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30) }, userIdentity);
}
}
}
Tuve el mismo problema y este código me funcionó (dentro del archivo Startup.cs) ..
services.Configure<IdentityOptions>(options =>
{
options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(9999);
});
Esto agrega aproximadamente 27 años (o nunca caduca) a la cookie persistente.
NB: Si deseara menos tiempo de caducidad, podría usar TimeSpan.FromMinutes(1);
durante 1 minuto o TimeSpan.FromSeconds(30);
durante 30 segundos etc.
Utilizar esta...
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
ExpireTimeSpan = TimeSpan.FromHours(1),
});
}