【茶包射手日記】網站在 localhost 測試正常,部署後出現 AntiForgeryToken 錯誤
| | | 0 | |
接手 ASP.NET MVC 網站進行翻修,Visual Studio 在本機 F5 跑 IIS Express 測試 OK,開心部署到 IIS 測試台卻馬上冒出 AntiForgeryToken 問題: The required anti-forgery cookie "__RequestVerificationToken_L0xxx" is not present / 需要的反仿冒 Cookie "__RequestVerificationToken_L0xxx" 不存在。
系統抱怨網頁沒有附上 __RequestVerificationToken_L0xxx 防偽造檢核欄位 (補充參考:ASP.NET Core 跨網站偽造要求 (XSRF/CSRF) 攻擊防護介紹),但網頁確認有加 @Html.AntiForgeryToken(),用 F12 觀察請求確實有附上 __RequestVerificationToken:

註:伺服器端檢查 __RequestVerificationToken_L0xxx 多了 _L0xxx 結尾,原因是 ASP.NET MVC 處理 Cookie 名稱時會自行加上路徑後綴,偵錯時可忽略。 (參考:ASP.NET Anti-Forgery Tokens internals by Sebastian Solnica)
追查一圈,最後發現問題出在網站的 web.config 設定了 <httpCookies requireSSL="true" httpOnlyCookies="true" /> (專案的過去我來不及參與,一開始沒注意到),限定 Cookie 只有在 HTTPS 連線時才可傳送。(延伸閱讀:淺談 ASP.NET Cookie 安全設定)
BUT!! 如果網站是 localhost 就另當別論...
依 W3C Secure Contexts 規範,以下來源被定義為 Potentially Trustworthy Origins,即使不是用 HTTPS 也可被視為「潛在可信任來源」:
http://localhost和http://*.localhost- IP 位址 127.0.0.0/8 和 ::1/128 (IPv6 loopback)
- file:// 協議
而依據社群實測,不同瀏覽器處理 HTTPS 限定 Cookie 的原則不同。像 Chrome 與 Firefox 允許 http://localhost 傳送限定 HTTPS 的 Cookie,Firefox 再允許特殊字首名稱的 Cookie,Safari 則全都不准:
| 瀏覽器 | Secure Cookie | __Host- Cookie | __Secure- Cookie |
|---|---|---|---|
| Firefox | ✅ 允許 | ✅ 允許 | ✅ 允許 |
| Chrome | ✅ 允許 | ❌ 不允許 | ❌ 不允許 |
| Safari | ❌ 不允許 | ❌ 不允許 | ❌ 不允許 |
實際觀察,確認網站在 localhost 執行時會傳送 HTTPS 限定的 __RequestVerificationToken 及 ASP.NET 相關 Cookie,算是解開了謎團。

這就是為什麼在 localhost 測得很開心,部署到網站後不行的主要原因。老鳥再學到新東西,下回遇到本機與其他主機 Cookie 相關問題,有此經驗下回便知要從哪裡先查起。
This post explains how requireSSL cookies behave differently on localhost vs. IIS, causing AntiForgeryToken errors due to browser trust rules.
Comments
Be the first to post a comment