会话cookie-用户在Asp.Net Identity 2中非持久登录后注销



我正在尝试配置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属性设置为某个值,该值将是非持久会话的会话长度。

相关内容

  • 没有找到相关文章

最新更新