簡體   English   中英

ASP.NET MVC 3 - 處理會話變量

[英]ASP.NET MVC 3 - Dealing with Session variables

我有一個使用Form的身份驗證的應用程序,當用戶登錄時,我檢索用戶的實際名稱並將其分配給會話變量,如下所示:

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            Session["Name"] = client.GetName(model.UserName);
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            return RedirectToAction("Index", "Home"); 
        }
    }
}

然后,它會顯示在我的索引視圖中,如下所示:

<h3>Welcome, @Session["Name"]</h3>

所以,如果我的名字是鮑勃,它會在我的視圖中輸出“歡迎,鮑勃”,這很好。 但是,一旦我離開頁面或關閉我的瀏覽器並在幾分鍾后返回,似乎這些Session變量已被銷毀,因為它只是輸出“歡迎”,但我仍然登錄,所以我的會話沒有被銷毀? 我在web.config中將會話設置為在60分鍾后銷毀:

<sessionState regenerateExpiredSessionId="true" timeout="60" />

編輯

這只發生在我登錄時檢查“記住我”框時,因為我猜這會保留一個cookie客戶端,所以當我重新打開瀏覽器時我仍然登錄但是創建一個新的會話ID,因為我做了一個Response.Write(Session.SessionID)在我關閉瀏覽器之前,在我的索引頁面上Response.Write(Session.SessionID)和ID與我重新打開它時的ID不同。 如果我不檢查我的“記住我”框,那么我將在重新打開瀏覽器后再次登錄

我的會話變量遇到了同樣的問題。 如果在登錄時選擇了“記住我”選項,它將繞過我的代碼以設置下次用戶訪問該站點時所需的會話變量。

如果IsAuthenticated為true,我可以通過重新填充會話變量來解決我的問題。

protected void Session_Start(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated)
    {
        Session["Name"] = client.GetName(User.Identity.Name);   
    }
}

不要將名稱添加到會話變量,只需更改以下內容即可

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

FormsAuthentication.SetAuthCookie(client.GetName(model.UserName), model.RememberMe);

然后,您可以使用User.Identity.Name而不是@Session [“Name”]。

你遇到的問題是線路問題

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

這是一個cookie,持續時間比會話長(取決於您設置表單超時的時間)

如果您只需要顯示用戶名,則可以使用並完全刪除會話

<h3>Welcome, @User.Identity.Name</h3>
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

此代碼應該可以正常工作,您應該能夠看到"Welcome USERNAME" ,嘗試查看IE設置是否像tools-->internet options-->General選項卡delete my browsing history是否已選中。 (在同一個選項卡上,您單擊刪除按鈕,您將看到其清除cookie也可能是問題)。

如果您關閉瀏覽器而不是會話(inproc)變量,將保留Cookie值。

也許首先檢查以確保不會以某種方式啟動新會話。 global.asax.cs文件的Session_Start中放置一個斷點:

protected void Session_Start(object sender, EventArgs e)
{
    var sessionId = Session.SessionID; // break here
}

這可能看起來很愚蠢,但有幾件事實際上可能導致新的會話。 消除這些將使您更接近解決方案。

關閉瀏覽器並再次打開它可能會導致新的會話。 對站點中文件夾結構的更改以及對web.config的更改將導致新會話(應用程序池將被回收)。

暫無
暫無

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

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