当用户通过单击按钮选择留在系统中时,会话超时会大大增加(asp.net mvc 5.0 使用 OWIN)

Session timeout increases tremendously when the user picks to stay in the system by clicking a button (asp.net mvc 5.0 using OWIN)

我正在尝试实现会话超时弹出窗口。我取得了相当大的进步。除了用户单击弹出 window 中的 "Stay in the system" 按钮外,一切似乎都运行良好。此按钮的作用是对 Account Controller 中的以下 Action 进行 ajax 调用:

public async Task<ActionResult> RefreshTheUserSession(string UserId)//this will be called from the ajax timeout
{       
    var myuser = await UserManager.FindByIdAsync(UserId);

    if (myuser != null)
    {
         await SignInManager.SignInAsync(myuser, true, true);
    }
    return null;
 }

这可以正常工作并让用户留在系统中。但是,新的会话超时时间跨度变为 1209596 左右。出于测试目的,此值最初设置为 2 分钟,如下所示 (Startup.Auth.cs)。

 app.UseCookieAuthentication(new CookieAuthenticationOptions
 {
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
      LoginPath = new PathString("/Home/Index"),
      ExpireTimeSpan = TimeSpan.FromMinutes(2),
      Provider = new CookieAuthenticationProvider
      {     
            OnValidateIdentity = MyCustomValidateIdentity
      }
 });

而且,实际上,当用户第一次登录系统时,ExpireTimeSpan 被正确设置为 2 分钟。然而,当用户点击停留在系统中的时候到了,会话超时时间跨度变得疯狂。

为了以防万一,这里是登录代码:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
         return View(model);
    }

    var result = await SignInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
             return RedirectToLocal(returnUrl);
        case SignInStatus.LockedOut:
             return View("Lockout");
    }
}

后来,我在Web.Config中添加了这个,但没有帮助。 (不确定它是否有帮助,因为我使用的是 OWIN)

<sessionState mode="InProc" timeout="20" />

有人知道为什么会这样吗?为什么当我尝试(重新)登录用户时会话超时值变得异常?

1209596 秒大约是 14 天,或 2 周。您在这里所做的是为用户设置 "remember me" 标志,这正是它所做的。它将用户的身份验证 cookie 的超时设置为 2 周,因此用户在 2 周内无需再次登录。

如果这不是您想要的,请将操作更改为:

public async Task<ActionResult> RefreshTheUserSession(string UserId)//this will be called from the ajax timeout
{       
    var myuser = await UserManager.FindByIdAsync(UserId);

    if (myuser != null)
    {
         await SignInManager.SignInAsync(myuser);
    }
    return null;
}

换句话说,不要为 isPersistentrememberBrowser 参数传递 true。您可能还需要先调用 AuthenticationManager.SignOut(),因为它可能不允许您登录已登录的用户。使用您现在拥有的代码,您通过使其持久化来在技术上更新身份验证,需要发送新的 cookie,所以这有点不同。