某次專案上線後,使用者反饋了一個問題:明明就登入了,卻還是會一直被導向登入頁面。
檢查了一下確定是自己在 Identity 使用上有所遺漏,先寫下來增加記憶。
1、發生原因
專案使用了網路負載平衡,藉由負載平衡器導向兩台應用程式所在主機。
應用程式中的 ASP.NET Identity 使用所在主機的金鑰對 cookie 進行加解密。
若下次通過負載平衡器連線應用程式時導向不同主機,應用程式中的 ASP.NET Identity 使用所在主機的金鑰對 cookie 進行解密,解密就會失敗。
解密失敗自然就被導向登入頁了…
2、解決方法
給定應用程式同一組金鑰與加解密驗證方法,讓應用程式中的 ASP.NET Identity 使用給定的金鑰與加解密驗證方法對 cookie 進行加解密。
3、電腦金鑰
在 IIS 管理員中,依序點選「應用程式」 → 「電腦金鑰」,進入「電腦金鑰」設定頁面。
由應用程式進入設定頁面為設定單一應用程式;由 IIS 根目錄進入設定頁面為設定整個站台。
4、產生金鑰
4.1 驗證設定
驗證方法、加密方法、驗證金鑰及解密金鑰。
4.2 產生金鑰
選擇「驗證方法」、「加密方法」,按下【產生金鑰】。
要取消勾選「在執行階段自動產生」。
4.3 套用
按下【套用】寫入應用程式的 Web.config 設定檔。
5、查看 Web.config,套用至其他應用程式
開啟應用程式 Web.config,多了一個 machineKey 的節點元素,將此節點元素複製到各個應用程式設定檔即可(表示這些應用程式使用同一組金鑰與加解密驗證方法)。
由於一組 machineKey 節點就將金鑰與加解密驗證方法設定完成,所以複製別人產生好的金鑰也是可以直接使用的,只是安全性上就見仁見智了…
嘗試將自己的理解寫成文字紀錄,資料來源均來自於網路。
如有理解錯誤、引用錯誤或侵權,請多加指正與告知,讓我有更多的進步與改進的空間,謝謝!