選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
4 分鐘閱讀時間 (769 個字)

為什麼我的 APS.Net Form Authentication 在 timeout 時間還沒到前就失效了

unsplash-coding098

狀況

明明設定就是 20 分鐘,為什麼才過了 10 幾分鐘,我就被強制登出了?

找問題的過程

一開始利用 Chrome DevTools 嘗試找出問題,但只看到 302 Redirect,不懂為什麼?

之後另外裝 Fiddler 來監控所有 Web 流量(其實用 DevTools 也是可以找問題,只是 Fiddler 的功能更強大),發現關鍵應該是在 .ASPXAUTH 的 Cookie 票證失效造成的,但明明還沒有到 20 分鐘,為什麼就失效了?

原因

ASP.Net Form Authentication 的機制是靠在瀏覽器端寫入一個加密的 Cookie (還有一種是靠 URL 傳參數的方式,但比較少用),當中會有使用者帳號,票證失效時間,其他應用系統想存的資訊等等。

票證失效時間是寫在該 Cookie 中,在票證產生時就決定了,例如 timeout 為 20 分鐘的話,票證是 1:00 產生的,我們就會設定該票證在 1:20 失效。

但是這樣一來,如果使用者使用系統超過 20 分鐘的時間,那他不就會被自動登出了嗎?還好 ASP.Net 有考慮到這件事情,他有一個 FormsAuthentication.SlidingExpiration 的設定,而且預設是 True,只要使用者有持續使用系統,他就會自動重新設定票證的失效時間。

但是為了避免不斷重新設定票證會影響效能,所以 SlidingExpiration 的行為是當票證已經超過原本的失效時間一半時才會重新設定票證,也就是說只有在 1:10 後使用者還有對 Server 送出要求才會重新取得新的票證。

這邊的設計就會產生我們所遇到的,為什麼我明明沒有超過 20 分鐘沒有使用系統,卻被要求重新登入。原因就在於 SlidingExpiration 重新取得票證的行為。如果我最後使用系統是在 1:09 的時候,這樣當我在 1:21 回來使用系統,雖然感覺上我只有 12 分鐘沒有使用系統,但因為我的票證失效時間還是 1:20 所以我就被要求重新登入。

但反過來說如果你最後使用系統的時間是 1:11, 由於已經超過了 1:10 所以你的票證會重取,新票證的失效時間就不會是 1:20 了,所以 1:21 回來使用系統,就不會被重新要求登入了。

所以雖然只差短短的一瞬間,但結果卻是完全不同喔!

結論

雖然 Form Authentication 的失效時間設定為 20 分鐘,並不表示一定要超過 20 分鐘沒有使用系統才會被要求重新登入,可能只要超過 10-20 分鐘都有可能會被要求重新登入,取決於你最後一次拿到得票證到期時間為何?

另外提一下的是,網路上的記住我的登入,一般也會利用一樣的方式來處理。
ASP.NET Core Web API 版本的做法
從【一例一休】續談測試案例設計
 

評論 1

Guest - rainmaker_ho 於 2017/03/24, 週五 01:04

您好,
另一個方式是手動更新 Cookie 的時間,
詳細可以參考「https://dotblogs.com.tw/rainmaker/2017/03/23/165147」哦!

您好, 另一個方式是手動更新 Cookie 的時間, 詳細可以參考「https://dotblogs.com.tw/rainmaker/2017/03/23/165147」哦!
已經注冊了? 這裡登入
Guest
2024/05/20, 週一

Captcha 圖像