我正在尝试配置Asp.Net Identity 2.2,以便能够正常永久登录。我知道有两个设置需要考虑,CookieAuthenticationProvider的validateInterval和CookieAuthentication选项的ExpireTimeSpan。以下是一个新的MVC 5应用程序附带的标准配置,ExpireTimeSpan和SlidingExpiration被明确设置为默认值,只是为了记住它们:
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))
},
ExpireTimeSpan = TimeSpan.FromDays(14),
SlidingExpiration = true,
});
每30分钟调用一次OnValidateIdentity,并检查用户的安全戳。如果它没有被更改(例如,用户没有更改他的密码),什么都不会发生-用户仍然登录。这是可以的。
如果我正常登录(不持久),则会创建一个cookie,其过期时间为"浏览器关闭时"。因此,注销时间不受任何控制,用户保持登录状态,直到他/她关闭浏览器或做出使安全戳无效的更改(更改密码或电子邮件等)
如果我持续登录,会创建相同的cookie,但它在14天后过期(这就是持续登录通常的工作方式,它不是"永远"的,而是仅在一段时间内)。因此,只要用户每14天至少使用一次应用程序,他/她就会保持登录状态。
我的问题是:即使用户没有关闭浏览器并且安全戳保持不变(相当于让浏览器打开15分钟),我如何使正常(非持久)登录在一段时间后过期,例如15分钟?如果我将ExpireTimeSpan设置为15分钟,则所有会话(包括持久会话)将变为仅15分钟,这不是解决方案。
我从SignInManager继承并添加了一个新属性:,成功地实现了这一点
/// <summary>
/// Defines how long a user session lasts if it is non persistent. A null value means until the browser is closed (default)
/// </summary>
public virtual TimeSpan? NonPersistentSessionDuration { get; set; }
并覆盖方法:
/// <summary>
/// Creates a user identity and then signs the identity using the AuthenticationManager
/// </summary>
/// <param name="user"></param>
/// <param name="isPersistent"></param>
/// <param name="rememberBrowser"></param>
/// <returns></returns>
public virtual async Task SignInAsync(TUser 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);
var properties = new AuthenticationProperties {IsPersistent = isPersistent};
if (!isPersistent && this.NonPersistentSessionDuration != null)
properties.ExpiresUtc = DateTimeOffset.UtcNow.Add(this.NonPersistentSessionDuration.Value);
if (rememberBrowser)
{
var rememberBrowserIdentity = AuthenticationManager.CreateTwoFactorRememberBrowserIdentity(ConvertIdToString(user.Id));
AuthenticationManager.SignIn(properties, userIdentity, rememberBrowserIdentity);
}
else
{
AuthenticationManager.SignIn(properties, userIdentity);
}
}
更改是为非持久登录设置AuthenticationProperties对象的ExpiresUtc属性。
当然,在SignInManager配置中,您必须将新的NonPersistentSessionDuration属性设置为某个值,该值将是非持久会话的会话长度。