[ASP.NET]cookieless如何闖禍

寫過ASP.NET的人或許不見得有用過cookieless這個設定,但這個設定之前也被廣泛討論了好一陣子,當出會提到這個設定最主要的原因是多個瀏覽器視窗間會共用Session所導致,而會共用Session主要的原因也是瀏覽器在取得SessionID時都是由client端的cookie所獲得有關,這邊不探討cookie跟Session的關係,這邊假設大家都已經知道了,來探討cookieless如何闖禍吧。

寫過ASP.NET的人或許不見得有用過cookieless這個設定,但這個設定之前也被廣泛討論了好一陣子,當初會提到這個設定最主要的原因是多個瀏覽器視窗間會共用Session所導致,而會共用Session主要的原因也是瀏覽器在取得SessionID時都是由client端的cookie所獲得有關,這邊不探討cookie跟Session的關係,這邊假設大家都已經知道了,來探討cookieless如何闖禍吧。

在ASP.NET中我們可以透過設定cookieless="true"來達到不使用cookie取得SessionID的效果,設定的方式如下:

image

在SessionState的Tag中加入cookieless="true"的設定,如此一來SessionID就不是透過cookie來傳遞,而是直接被放在URL中囉,我們來比較一下設定true跟false的差別吧:

這是一般狀況,沒有設定cookieless或者設為false的時候:

image

下面這個則是設定cookieless="true"的狀況:

image

我們發現在網址列多了一串亂碼,而這串亂碼(S(yqf3qhrawfssk5r3iid5mt3j))紅色部分就是SessionID了,這種方式當我們在網址列打上http://localhost:36874/WebSite2/Default.aspx,會自動轉成http://localhost:36874/WebSite2/(S(lwpqkl45zkuryo45maoiwh25))/Default.aspx,且每次的SessionID都不相同,因此即使我們在同一台client上使用不同的IE視窗開起同一個網站,我們也可以確保兩者之間的Session不會共用。

 

看起來好像都很好,不過在去年在一個case中遇到一個很有趣的問題,有家客戶反應,使用者會非預期的被踢出系統,且沒有任何徵兆,聽到這個狀況直覺問題並不單純,馬上到客戶家實際跑了一趟,去到客戶家操作系統時,我跟另一個同事一人用一個帳號登入,結果發現當我登出系統時,同事也同時被從系統中剔掉了,由於我們系統的登入資訊是透過Session來記錄,因此直覺上認為跟Session有關聯,但為何兩台電腦間會互相干擾呢?

追查的結果,原來與cookieless有關係,因為系統導入初期,MIS人員將他第一次使用系統登入首頁的URL用mail寄給每個人,而這個URL中包含了他自己的SessionID,導致兩個Client間因為這個SessionID而將彼此的關聯在一起,A使用者登出實會清除Session中的登入資訊,這就導致跟他共享Session的B使用者登入資訊被清空了,狀況如下:

按下按鈕後我會將某個Session值123寫到畫面上:

image

Code是這樣寫的:

01 protected void Page_Load(object sender, EventArgs e)  
02 {  
03     MyRegion   
12 }
  
13 protected void Button1_Click(object sender, EventArgs e)  
14 {  
15     Session["UserInfo"] = "123";  
16 }

 

接著我複製他的網址,貼到另一個IE視窗,發現它讀到另一個瀏覽器的Session,這個問題即使換一台機器來測試也是一樣:

image

後來請MIS將SessionID拿掉,再將沒有SessionID的URL寄給大家,這個問題就解決了。

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。