昨天項目遷移了測試服務器,之后奇怪的問題出現了。
IE、谷歌無法登陸,火狐可以登陸。
這個項目先后部署過兩個測試服務器、一台正式服務器,登陸都是正常的,這次卻突然出現這種奇怪的問題,很是糾結。
通過查看代碼,邏輯很清晰,不應該有問題。
跟蹤瀏覽器
信息,發現登陸邏輯正常執行,最后進行了頁面跳轉,之后又跳轉回來,那么應該是權限驗證失敗。
沒有拋出無權限提示,那么只能是讀取Cookie失敗。
檢查IE、谷歌的Cookie記錄,發現登陸頁面沒有完成Cookie寫入,這種簡單的Cookie操作,.NET不應該會有問題的。
開始百度,百度垃圾,沒找到想要的。
開始谷歌,找到一個差不多的(
服務器的時間和時區設置可能影響Cookie,IE而言,Cookie的有效時間段是理解為客戶端的時間與服務器端時間的間隔,對於FireFox而言,Cookie的有效時間完全由服務器端的時間決定)
修改本機時間為昨天,測試,登陸成功,基本確定服務器問題。
找運維,檢查服務器時間時區設置,果然是這個問題。
修改,登陸成功!
IE和Firefox下的Cookie兼容問題 .
用Firefox可以登錄,使用IE后,部分可以登錄,部分不可以登錄。最初是懷疑IE的Cookie功能沒有打開引起的,測試到最后這個原因也排除了。
既然是通過Cookie實現SSO,那認證必然是保存在Cookie中,Cookie文件就是保存在本地的緩存目錄下(firefox下的Cookie是加密的,查不到Cookie文件),但是奇怪的是IE登錄后,緩存目錄下根本沒有發現生成的Cookie文件,這就是不能登錄的根本原因。
為什么沒有生成Cookie文件呢,要不沒有生成,要不生成了又被IE銷毀了。前者不可能發生,如果不生成Cookie,那為什么有些瀏覽器行,firefox更是全部可以,只能懷疑第二個原因,Cookie是被IE自動銷毀了,IE銷毀Cookie是根據Cookie的生命期,例如,Cookie是2009-01-01 01:00:01生成的,有效時間是5個小時,那到了2009-01-01 06:00:01后,IE就會銷毀此Cookie文件。對於IE而言,Cookie的有效時間段是理解為客戶端的時間與服務器端時間的間隔,而對於FireFox而言,Cookie的有效時間完全由服務器端的時間決定,Firefox的cookie不依賴於服務器的時間,可見,FireFox是充分考慮到了服務器端與客戶端的時差問題。
立即檢查系統的時間,發現系統時間和服務器沒有差別,有一點納悶,影響時間的還有一個時區(timezone),果然原因找到,時區設定錯誤。時區設定不正確也會影響IE對Cookie生命期的計算,因為Cookie的生命期是基於GMT計算的。
原因總結:沒有登錄成功的IE,是因為沒有設定正確的時區和時間,導致IE錯誤將保存認證信息的Cookie文件自動銷毀了,所以無法登錄。
