我将一个 asp.net webforms 网站部署到运行 Windows WebServer 2008 和 IIS 7 的计算机上。AppPool 使用 Framework 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="..." />
答案1
您能否确认会话 cookie 确实存在并且会随每个请求一起发送?如果没有现有会话,IIRC 访问 SessionID 只会在每次请求时返回一个新值。
您可能还想看看 Visual Studio 2012 / 2013 中的“文件 -> 新建 -> 项目 -> ASP.NET Web 窗体项目”模板的作用。具体来说,看看站点.Master.cs在新的项目模板中。该代码使用单独的(非会话)cookie,正是为了避免在应用程序中维护会话所固有的问题。
使用此方法还允许您在 Login.aspx 页面中放置反 CSRF 防御措施,以便该页面也受到保护。