首页 > 解决方案 > IIS 8.5 事件代码 4009 Viewstate 使用应用程序池标识失败

问题描述

我们正在尝试通过为每个站点使用唯一的应用程序池,并在应用程序池标识下运行这些应用程序池,从而为网站实施良好的 IIS 8.5 实践。我们一直在域帐户下运行我们的应用程序池。我们已经能够成功地切换到使用应用程序池标识和 web 服务。但是对于使用 Windows 身份验证的网站,使用应用程序池的应用程序池标识,该站点会出错。在 Windows 应用程序事件日志中,关联的错误是“事件代码 4009 - 视图状态验证失败: : 视图状态完整性检查失败”。该网站本身给用户一个未经授权的消息。它使用 WindowsPrincipal.IsInRole 方法来确定用户是否在 AD 组中。

关于这个问题的一些帖子提到了更新 machine.config 中的密钥。这是一个独立的服务器。一旦我将站点的相同应用程序池切换回使用域帐户,它就可以工作。

Windows Server 2012,.NET 框架 4.0,u

标签: c#asp.netiis-8

解决方案


基本问题在于使用 WindowsPrincipal.IsInRole 方法和 System.Environment 变量。

WindowsPrincipal currentPrince = new WindowsPrincipal((WindowsIdentity)identity;
string domainName = System.Environment.Us variableerDomainName;

if currentPrince.IsInRole(domainName + "\\" + groupNane))System
   { 
        bool isAuthenticated = true; '
   }

在域帐户下运行时,System.Environment 变量包含与身份相同的域。

在 AppPoolIdentity 伪帐户下运行时,System.Environment 变量包含“IIS_AppPool”。

因此,在该域名下自然找不到任何组成员身份。


推荐阅读