在 ASP.NET 中重複使用工作階段 ID 的方法和原因

文章翻譯 文章翻譯
文章編號: 899918 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

簡介

本文將告訴您,使用 Microsoft ASP.NET 工作階段 ID 的方法和原因。

其他相關資訊

ASP.NET 工作階段狀態是能夠讓您存放伺服器端之使用者專屬資料的技術。Web 應用程式能夠使用這項資料,處理來自工作階段狀態已進行具現化之使用者的要求。工作階段狀態使用者是由工作階段 ID 加以識別。工作階段 ID 使用下列其中一種方法傳遞:
  • 將工作階段 ID 做為傳送至使用者瀏覽器之 Cookie 的一部分。
  • 將工作階段 ID 內嵌在 URL 中,這項技術也稱為「Cookie-less 工作階段」
工作階段 ID 是由一個 20 個字元的字串所表示的 120 位元亂數。這個字串經過格式化,以便能夠包含在 URL 中,並且不需要經過 URL 編碼。例如,這個字串可以使用在 cookie-less 工作階段中。傳遞工作階段 ID 最常見的方法是使用 Cookie 存放工作階段 ID。

當使用者首次開啟網頁瀏覽器,然後移至實作 ASP.NET 工作階段狀態的網站時,這個網站就會將名稱為 "ASP.NET_SessionId" 以及具有 20 個字元值的 Cookie 傳送至瀏覽器。

當使用者在相同 DNS 的網域中瀏覽時,網頁瀏覽器會將此 Cookie 進一步傳送至其來源網域中。

例如,app1.tailspintoys.com 和 app2.tailspintoys.com 都是 ASP.NET 應用程式。如果使用者先到 app1.tailspintoys.com,然後再移至 app2.tailspintoys.com,則兩個應用程式會使用相同的 Cookie 以及工作階段 ID,以追蹤每個應用程式中使用者的工作階段狀態。這些應用程式不會共用相同的工作階段狀態,而是只共用工作階段 ID。

因此,您可以基於幾個理由重複使用工作階段 ID。例如,如果您重複使用工作階段 ID,就不需要執行下列操作:
  • 當您取得有效的工作階段 ID 時,建立就密碼編譯而言是唯一的新工作階段 ID。
  • 為單一網域中每個 ASP.NET 應用程式建立新的工作階段 ID。
當 Web 應用程式需要登入並提供登出頁面或選項時,我們建議您在使用者登出網站時清除工作階段狀態。如果要清除工作階段狀態,請呼叫 Session.Abandon 方法。Session.Abandon 方法能夠讓您清除工作階段狀態,而不需要等候工作階段狀態逾時。根據預設,此逾時是 20 分鐘滑動期限。每次使用者對網站送出要求並提供工作階段 ID Cookie 時,就會重新整理此期限。Abandon 方法會在工作階段狀態物件中設定旗標,指出應該放棄工作階段狀態。在頁面要求結束時會檢查此旗標並做出動作。因此,在您呼叫 Abandon 方法之後,使用者便可以在頁面內使用工作階段物件。一旦頁面處理完成,就會移除工作階段。

當您使用同處理序工作階段狀態模式時,這些工作階段狀態物件會存放在 HttpCache 中。下列條件成立時,HttpCache 支援回呼方法:
  • 已移除快取項目。
  • 「工作階段狀態管理員」(Session State Manager) 註冊 Session_OnEnd 事件處理常式,在快取項目移除時接受呼叫。
當「工作階段狀態管理員」移除快取中的工作階段狀態物件時,HttpCache 管理員將呼叫任何已註冊的回呼。實際上,這個行為會引發 Session_OnEnd 事件處理常式。

當您放棄工作階段時,工作階段 ID Cookie 並不會從使用者的瀏覽器中移除。因此,在放棄工作階段的同時,任何對相同應用程式提出的新要求將使用相同的工作階段 ID,但是將擁有新的工作階段狀態執行個體。同時,如果使用者在相同 DNS 網域中開啟另一個應用程式,在其中任一個應用程式呼叫 Abandon 方法後,使用者將不會遺失其工作階段狀態。

有時候,您可能不想重複使用工作階段 ID。如果是這種情況,而您也瞭解不重複使用工作階段 ID 的結果,請使用下列程式碼範例放棄工作階段,並清除工作階段 ID Cookie:
Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
這個程式碼範例會清除伺服器中的工作階段狀態,並且將工作階段狀態 Cookie 設定為 Null。Null 值可以有效清除瀏覽器的 Cookie。

當使用者沒有從應用程式登出且發生工作階段狀態逾時,如果瀏覽器沒有關閉,應用程式仍然會使用相同的工作階段狀態 Cookie。這個行為會將使用者導向登入頁面,並且提供使用者的工作階段狀態 Cookie。如果要確保當您開啟登入頁面 (login.aspx) 時使用新的工作階段 ID,請將 Null Cookie 傳送回用戶端。如果要執行這項操作,請將 Cookie 新增至回應集合,然後將回應集合傳送回用戶端。傳送 Null Cookie 最簡單的方式是使用 Response.Redirect 方法。由於 Cookie 集合中一定含有 ASP.NET_SessionId 的值,所以如果此 Cookie 存在的話就不能只進行測試,因為會建立 Response.Redirect 迴圈。您可以在重新導向至登入頁面上設定查詢字串。

或是如同下列程式碼範例所示,您可以使用不同的 Cookie 辨識是否已經重新導向至登入頁面。為了協助增強安全性,並且確定沒有人會使用第二個 Cookie 搭配 ASP.NET Cookie 嘗試開啟登入頁面,可以參考下列程式碼範例使用 FormsAuthentication 類別加密和解密 Cookie 資料,然後設定 5 秒鐘的逾時。
private void Page_Load(object sender, System.EventArgs e)
{ 
if( !IsPostBack && 
( Request.Cookies["__LOGINCOOKIE__"] == null ||
Request.Cookies["__LOGINCOOKIE__"].Value == "" ) )
{
//At this point, we do not know if the session ID that we have is a new
//session ID or if the session ID was passed by the client. 
//Update the session ID.

Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

//To make sure that the client clears the session ID cookie, respond to the client to tell 
//it that we have responded. To do this, set another cookie.
AddRedirCookie();
Response.Redirect( Request.Path );
}

//Make sure that someone is not trying to spoof.
try
{
FormsAuthenticationTicket ticket =
FormsAuthentication.Decrypt( Request.Cookies["__LOGINCOOKIE__"].Value );

if( ticket == null || ticket.Expired == true ) 
throw new Exception();

RemoveRedirCookie();
}
catch
{
//If someone is trying to spoof, do it again.
AddRedirCookie();
Response.Redirect( Request.Path );
}


Response.Write("Session.SessionID="+Session.SessionID+"<br/>");
Response.Write("Cookie ASP.NET_SessionId="+Request.Cookies["ASP.NET_SessionId"].Value+"<br/>");
} 

private void RemoveRedirCookie() 
{ 
Response.Cookies.Add(new HttpCookie("__LOGINCOOKIE__", "")); 
} 

private void AddRedirCookie()
{

FormsAuthenticationTicket ticket = 
new FormsAuthenticationTicket(1,"Test",DateTime.Now,DateTime.Now.AddSeconds(5), false,""); 
string encryptedText = FormsAuthentication.Encrypt( ticket ); 
Response.Cookies.Add( new HttpCookie( "__LOGINCOOKIE__", encryptedText ) );
}

屬性

文章編號: 899918 - 上次校閱: 2006年10月4日 - 版次: 1.4
這篇文章中的資訊適用於:
  • Microsoft .NET Framework 1.1
關鍵字:?
kbhowto kbinfo KB899918
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com