設置 ViewStateUserKey 時,視圖狀態 MAC 驗證失敗(沒有網路花園或網路農場)
我將一個 asp.net webforms 網站部署到執行 Windows WebServer 2008 和 IIS 7 的機器上。AppPool 使用框架 4,集成管道,以域使用者的身份執行。我沒有經營網路農場或網路花園。該網站只有一個綁定到 http 埠 80。
回發除登錄頁面以外的任何頁面時,我都會收到“驗證視圖狀態 MAC 失敗”。
在這個應用程序中,我們在後面的程式碼中為除登錄頁面之外的每個頁面設置 ViewStateUserKey 為 Session.SessionID。當我將此行註釋掉時(即,當我停止設置 ViewStateUserKey 時)錯誤消失了。
當我將“enableViewStateMAC”設置為 false 時,該錯誤也會消失。
我到處搜尋此錯誤的建議是查看 machineKey。我嘗試使用預設的自動生成的機器密鑰和定義的機器密鑰(下面的範例),還嘗試從 web.config 中刪除 machineKey 標記,但沒有成功。
此應用程序在不同的伺服器(還有 Windows Web Server 2008、IIS 7、framework v4)上成功執行。成功的應用程序將 ViewStateUserKey 設置為 SessionId,machineKey 類似於下面的第三個範例,具有定義的解密和驗證密鑰。
我很困惑為什麼這個應用程序在伺服器“A”上執行良好,但在伺服器“B”上的 ViewState 無效。如果有人對如何調試此問題有任何建議,我將不勝感激。
<machineKey decryption="Auto" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" validationKey="AutoGenerate,IsolateApps" /> <machineKey decryption="AES" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" validationKey="AutoGenerate,IsolateApps" /> <machineKey decryption="AES" decryptionKey="..." validation="SHA1" validationKey="..." />
您能否確認 Session cookie 確實存在並且每個請求都發送了它?如果沒有現有會話,IIRC 訪問 SessionID 只會在每個請求中返回一個新值。
您可能還想查看文件 -> 新建 -> 項目 -> ASP.NET Web 窗體項目模板在 Visual Studio 2012 / 2013 中的作用。具體來說,請查看新項目模板中的Site.Master.cs。該程式碼精確地使用單獨的(非會話)cookie 來避免嘗試在應用程序中維護會話所固有的問題。
使用這種方法還允許您在 Login.aspx 頁面中放置反 CSRF 防禦,因此該頁面也受到保護。