簡體   English   中英

如果我的Asp.Net會話具有IsNewSession == true,那是什么意思,我應該注意嗎?

[英]What does it mean if my Asp.Net session has IsNewSession == true, and should I care?

首先,這是我繼承的代碼,編寫它的人不再在這里也可以提問。

我有一些生產中的用戶因為隨意退出我們的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);
    }
}

我不太確定為什么需要此代碼(為什么要歸因於此而不是使其成為全局代碼),但是我在搜索中看到了Internet上此代碼的各種變化,但沒有說明為什么想要它。

無論如何,它已經存在於我們的代碼庫中,而我們所面臨的問題似乎是,如果用戶在窗口中閑置了一小段時間,然后他們執行了某些操作,則ctx.Session不是null而是ctx.Session.IsNewSession為true。

這對我而言意味着,由於某種原因,Asp.net決定該用戶需要為他們啟動一個全新的會話,並且由於我們不知道該用戶是誰(因為自此以來,他們的所有會話數據都消失了……這是一個新會話) ),我們需要將其注銷並重新登錄。

這一切似乎合乎邏輯,只是我終於能夠在IsNewSession if語句中達到斷點。 對我來說奇怪的是,我的會話實際上看起來100%已填寫(並正確填寫)。 這意味着它正確地知道我是誰,以及僅在您成功登錄后才將所有其他信息放入會話中。

此外, ctx.User.Identity.IsAuthenticated為true,並且具有正確的登錄名。

一切似乎都表明我有一個有效的會話,但是由於此代碼正在做出設計決定,如果Asp.Net創建一個新會話,則必須注銷,因此用戶將注銷。

所以我的問題是:

  1. Session.IsNewSession實際上是什么意思?
  2. IsNewSession為true時始終注銷用戶是否正確?
  3. 只要列出的用戶已通過身份驗證並且具有有效的會話數據,是否存在不注銷用戶的后果?
  4. 是什么原因導致Asp.Net創建新會話並仍然重用以前的會話數據?
  5. 我對會話期滿的理解是它是由提供程序層引起的,因為如果會話期滿,Asp.Net甚至沒有任何會話數據。 不是嗎?

快速說明一下,我們當前使用Redis作為會話存儲。 另外,如果相關,該應用程序將托管在Azure網站上(我不確定這如何影響會話過期)。

每當沒有當前會話的瀏覽器導航到站點時,ASP.NET都會創建一個新的Session。 因此,即使沒有登錄,他們仍然會有一個會話。 同樣,如果一個會話到期,則下次瀏覽器發出請求時將創建一個新會話。 這個新會話將不會存儲“會話數據”,但是ctx.Session不會為空。 另外,如果您有多個服務器,並且負載平衡器恰巧將用戶路由到其他服務器,則該新服務器將嘗試啟動新會話。

會話狀態與身份驗證狀態分開跟蹤,這意味着一個可以過期而另一個仍然有效。 對於編寫良好的應用程序,這通常不會引起任何問題。 但是,某些應用程序在登錄時會將信息預加載到會話中,並在會話期間將會話視為對此信息的一種緩存。 或者,當用戶執行某些操作時,它們將在會話上設置值,以后的操作將期望這些值出現在會話上,因為用戶應該已經瀏覽了這些較早的操作才能到達該會話。 (例如,向導界面,其中每個步驟都將值保存到會話中,以便在用戶在最后一步中單擊“完成”時使用。)

您的應用程序有時可能期望會話中存在數據,而開發人員意識到ASP.NET會自動更新該會話,從而丟失所有先前設置的會話數據,因此開發人員意識到該數據不存在。 他們沒有重新設計對會話數據的使用,而是選擇使其成為會話數據,以便每次丟失會話時都將迫使用戶回到合理的開始位置,在此頁面不會因為會話而以奇怪的方式中斷-存儲的數據丟失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM