1. 程式人生 > 實用技巧 >記錄BUG記錄美好生活

記錄BUG記錄美好生活

記錄.NET+IIS伺服器導致Cookie無法寫入瀏覽器

BUG表現方式

昨天因為公司寫的.NET WEB API 專案在兩臺伺服器上部署,其中部署在A伺服器執行一切正常,而部署在B伺服器則出現登陸資訊丟失的問題。

BUG查詢

我根據兩臺伺服器部署的前端來進行檢測,檢視是否有什麼不同,後來發現登陸成功之後是在響應頭上兩臺伺服器都返回了用於驗證身份資訊的.ASPXAUTH的Cookie,再往下查我在瀏覽器(谷歌)Application-Storage-Cookies裡面檢視瀏覽器是否真的記錄了.ASPXAUTH的Cookie,發現果然A伺服器是存在的,B伺服器沒有;在得出此結論之後的我又陷入了沉思…

  1. 在此次程式碼版本更新中我只給驗證身份資訊的Cookie增加了一個過期時間;
  2. 同一套後臺程式碼部署在兩個伺服器;
  3. 是什麼原因讓A伺服器部署的前端瀏覽器能正常儲存Cookie,而B伺服器不行
  4. 既然都是同一套程式碼,不是後端的問題,應該也不是前端的問題吧,難道是運維部署的時候配置沒有配對?(我趕緊讓運維去檢查後端的web.config)

針對上面提出的問題我與運維分頭行動,在經過幾分鐘的查詢問題之後,我去對比了兩個伺服器後端登陸介面返回的響應頭終於有所發現:

  1. 兩個伺服器後端返回的響應頭Date時間不對,A伺服器返回的響應頭Date會隨著A伺服器的系統時間所變動;B伺服器後端返回的Date是不變的,固定在某一時間;在這裡插入圖片描述
  2. 到這裡真正導致B伺服器登陸資訊丟失的問題已經找到:
    這個Date響應頭是跟Cookie的過期時間有著很大關係的。因為我後端設定的Cookie是有過期時間的,因為A伺服器後端返回的響應頭是正常的,所以A伺服器並沒有問題;而B伺服器返回的時間永遠定格在某個時間段(這個時間段永遠大於我的Cookie的過期時間),所以導致我B伺服器返回來的Cookie永遠是過期的,進而導致了BUG的產生

BUG進階

是什麼原因導致了B伺服器後端返回的響應頭Date的時間永遠不變呢?

面對這問題,我苦苦思索,思索是否是程式碼的問題,後端?不可能。前端?更不可能。
那剩下唯一可能改變響應頭Date就是IIS伺服器了。我果斷上B伺服器的IIS上看了看,然而並沒有什麼地方寫死了Date響應頭。於是我又陷入了沉思…

在經過一段時間的翻閱資料終於有所發現:

  1. 由於IIS伺服器的時間同步功能的BUG,並且在虛擬機器上經常發現。
  2. 將系統時間更改為將來的時間(例如2020年5月11日)
  3. 瀏覽任何站點-驗證在新日期/時間建立的日誌檔案
  4. 將系統時間更改為正確的(今天的日期和時間)
  5. 現在,瀏覽任何網站,發現日誌檔案上的時間現在停留在2020年5月11日

BUG解決方法

  • net stop http 停止HTTP服務
  • net start http 啟動HTTP服務
  • iisreset 重啟IIS伺服器

最後獻上我參考的文章:https://serverfault.com/questions/217343/date-header-returned-by-iis7-is-wrong