[英]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創建一個新會話,則必須注銷,因此用戶將注銷。
所以我的問題是:
Session.IsNewSession
實際上是什么意思? IsNewSession
為true時始終注銷用戶是否正確? 快速說明一下,我們當前使用Redis作為會話存儲。 另外,如果相關,該應用程序將托管在Azure網站上(我不確定這如何影響會話過期)。
每當沒有當前會話的瀏覽器導航到站點時,ASP.NET都會創建一個新的Session。 因此,即使沒有登錄,他們仍然會有一個會話。 同樣,如果一個會話到期,則下次瀏覽器發出請求時將創建一個新會話。 這個新會話將不會存儲“會話數據”,但是ctx.Session
不會為空。 另外,如果您有多個服務器,並且負載平衡器恰巧將用戶路由到其他服務器,則該新服務器將嘗試啟動新會話。
會話狀態與身份驗證狀態分開跟蹤,這意味着一個可以過期而另一個仍然有效。 對於編寫良好的應用程序,這通常不會引起任何問題。 但是,某些應用程序在登錄時會將信息預加載到會話中,並在會話期間將會話視為對此信息的一種緩存。 或者,當用戶執行某些操作時,它們將在會話上設置值,以后的操作將期望這些值出現在會話上,因為用戶應該已經瀏覽了這些較早的操作才能到達該會話。 (例如,向導界面,其中每個步驟都將值保存到會話中,以便在用戶在最后一步中單擊“完成”時使用。)
您的應用程序有時可能期望會話中存在數據,而開發人員意識到ASP.NET會自動更新該會話,從而丟失所有先前設置的會話數據,因此開發人員意識到該數據不存在。 他們沒有重新設計對會話數據的使用,而是選擇使其成為會話數據,以便每次丟失會話時都將迫使用戶回到合理的開始位置,在此頁面不會因為會話而以奇怪的方式中斷-存儲的數據丟失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.