如果我的Asp.Net会话有IsNewSession == true,那我的意思是什么?

Kal*_*exx 6 asp.net session

首先,这是我继承的代码,编写它的人不再在这里,也无法提问.

我的生产中的用户因随机退出我们的Asp.Net MVC应用程序而烦恼(根据参考我们的MVC库是版本5).在代码和网站上喋喋不休一段时间后,我想我已经将用户看到的内容与以下代码进行了隔离:

public class SessionExpireFilterAttribute : ActionFilterAttribute
{

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext ctx = HttpContext.Current;

        // check if session is supported
        if (ctx.Session != null)
        {

            // check if a new session id was generated
            if (ctx.Session.IsNewSession)
            {

                // If it says it is a new session, but an existing cookie exists, then it must
                // have timed out
                string sessionCookie = ctx.Request.Headers["Cookie"];
                if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    SessionVariables.Current.User = null;
                    FormsAuthentication.SignOut();

                    filterContext.Result = new RedirectResult("~/Account/Logon");

                    return;
                }
            }
        }

        base.OnActionExecuting(filterContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

我不完全确定为什么需要这个代码(为什么你要将其归结为而不是将其全局化)但我在搜索中看到了这些代码在互联网上的变化,但没有描述为什么你需要它.

无论如何,它已经存在于我们的代码库中,而我们遇到的问题似乎是,如果用户在窗口中闲置了一小段时间然后他们做了某些事情,那么这ctx.Session不是空的,而是ctx.Session.IsNewSession真的.

这对我来说意味着由于某种原因Asp.net决定这个用户需要为他们启动一个全新的会话,因为我们不知道这个用户是谁(因为他们所有的会话数据都已经消失了......这是一个新的会话)我们需要将它们注销并让它们再次登录.

这一切看似合乎逻辑,除了我最终能够在IsNewSessionif语句中找到一个断点.对我来说奇怪的是,我的会话实际上看起来100%填写(并填写正确).这意味着它正确地知道我是谁,以及当您成功登录时才会进入会话的所有其他信息.

此外,ctx.User.Identity.IsAuthenticated是的,它具有正确的登录名.

一切似乎都表明我有一个有效的会话,但由于这个代码正在做出设计决定,如果Asp.Net创建一个新的会话我必须注销,用户将被注销.

所以我的问题是:

  1. Session.IsNewSession实际意义上的含义是什么?
  2. IsNewSession当真实时始终将用户注销是否正确?
  3. 只要它们被列为经过身份验证且具有有效的会话数据,是否有任何后果不记录用户的后果?
  4. 是什么导致Asp.Net创建一个新会话但​​仍然重用以前的会话数据?
  5. 我对会话到期的理解是它是由提供者层引起的,因为如果会话已经过期,Asp.Net甚至不会有任何会话数据.那不是这样吗?

作为快速说明,我们目前正在使用Redis作为会话商店.此外,如果相关应用程序正在Azure网站上托管(我不确定这会如何影响会话到期).

Str*_*ior 5

每当没有当前会话的浏览器导航到站点时,ASP.NET都会创建一个新的Session。因此,即使没有登录,他们仍然会有一个会话。同样,如果一个会话到期,则下次浏览器发出请求时将创建一个新会话。此新会话将不会存储“会话数据”,但ctx.Session不会为null。另外,如果您有多个服务器,并且负载平衡器恰巧将用户路由到其他服务器,则该新服务器将尝试启动新会话。

会话状态与身份验证状态分开跟踪,这意味着一个可以过期而另一个仍然有效。对于编写良好的应用程序,这通常不会引起任何问题。但是,某些应用程序在登录时会将信息预加载到会话中,并在会话期间将会话视为对此信息的一种缓存。或者,当用户执行某些操作时,它们将在会话上设置值,以后的操作将期望这些值出现在会话上,因为用户应该已经浏览了这些较早的操作才能到达该会话。(例如,向导界面,其中每个步骤都将值保存到会话中,以便在用户在最后一步中单击“完成”时使用。)

您的应用程序有时可能期望会话中存在数据,而开发人员意识到ASP.NET会自动更新该会话,从而丢失所有先前设置的会话数据,因此开发人员意识到该数据不存在。他们没有重新设计对会话数据的使用,而是选择使其成为会话数据,以便每次丢失会话时都将迫使用户回到合理的开始位置,在此页面不会因为会话而以奇怪的方式中断-存储的数据丢失。