使用应用程序池标识的IIS应用程序丢失主令牌?

(这是关于一个模糊问题的问题,我试图提供所有相关数据,希望有人有帮助的信息;对长描述道歉。

我们的networking应用

我们有一个运行在IIS 7.5中的.NET 4 Web应用程序访问Active Directory和一个SQL Server数据库。

通过将应用程序的应用程序池的标识设置为ApplicationPoolIdentity ,该Web应用程序在虚拟“应用程序池标识”下运行。 关于虚拟身份的简要描述可以在StackOverflow的答案和它引用的博客文章中find:应用程序池身份只是一个附加组,它被添加到作为“networking服务”运行的Web应用程序的工作进程中。 然而,有一个消息来源隐约暗示,“networking服务和ApplicationPoolIdentity确实存在IIS.net站点文档不公开的区别”。 所以虚拟身份可能不仅仅是一个额外的团体。

我们select使用ApplicationPoolIdentity而不是NetworkService,因为它已经成为IIS 7.5中的默认设置(参见这里 ),并且按照微软的build议:“这个标识允许pipe理员指定仅与应用程序的身份相关的权限池正在运行,从而增加了服务器的安全性。“ (来自processModel元素,用于为applicationPools添加[IIS 7设置架构] )“应用程序池标识是一个强大的新隔离特性”,它使“运行IIS应用程序更加安全可靠”(来自IIS.net文章“Application Pool Identities” )

该应用程序使用集成Windows身份validation,但使用<identity impersonate="false"/> ,以便不使用最终用户身份,而使用虚拟应用程序池标识来运行我们的代码。

此应用程序使用System.DirectoryServices类(即ADSI API)查询Active Directory。 在大多数地方,这是在没有指定额外的用户名/密码或其他凭据的情况下完成

此应用程序还使用连接string中的Integrated Security=true连接到SQL Server数据库。 如果数据库是本地的,那么我们看到IIS APPPOOL\OurAppPoolName用于连接到数据库; 如果数据库是远程的,那么使用机器帐户OURDOMAIN\ourwebserver$

我们的问题

我们经常遇到下列其中一种情况,即安装工作开始失败的问题。

  • 当数据库在远程系统上时,数据库连接开始失败:“NT AUTHORITY \ ANONYMOUS LOGON用户login失败”原因:基于令牌的服务器访问validation失败,出现基础结构错误,请检查以前的错误。 以前的错误是“错误:18456,严重性:14,状态:11。 所以现在看来OURDOMAIN\ourwebserver$不再被使用,而是尝试匿名访问。 (我们有轶事证据表明,这个问题是在UACclosures的时候发生的,而且在UAC打开后就消失了,但是请注意,更改UAC需要重新启动……) IIS.net线程中报告了类似的问题“use ApplicationPoolIdentity连接到SQL“ ,具体在一个答复 。

  • 通过ADSI(System.DirectoryServices)的Active Directory操作开始失败,错误为0x8000500C(“未知错误”),0x80072020(“发生操作错误”)或0x200B(“指定的目录服务属性或值不存在”) 。

  • 从Internet Explorerlogin到应用程序开始失败,并出现HTTP 401错误。 但是,如果在IIS中,我们然后在协商之前放置NTLM然后它再次工作。 (请注意,Kerberos需要访问AD,但不能用于NTLM。) IIS.net线程“窗口身份validation失败,AppPool身份validation”中报告了类似的问题。

我们的假设和解决方法

将应用程序池从ApplicationPoolIdentity切换到NetworkService时,至lessAD和login问题似乎总是消失。 (我们发现有一个报告证实了这一点。)

页面“ASP页面上的身份validation问题疑难解答”提供了一些与主令牌和辅助令牌相关的build议,我发现令人鼓舞的是,它将前两个错误链接起来:提到NT AUTHORITY\ANONYMOUS LOGON访问,AD错误0x8000500C和“指定的目录服务属性或值不存在”。

(同一个页面也提到了ADSI模式caching问题,但是我们在这个话题上find的所有东西都是旧的,现在我们认为这是不相关的。)

基于上述,我们目前的工作假设是,只有在虚拟应用程序池身份下运行时, 我们的Web应用程序(IIS?worker进程?)突然失去了它的主令牌 ,所以IIS只有一个辅助令牌,访问Active Directory和SQL Server是匿名完成的,导致所有上述错误。

现在我们打算从ApplicationPoolIdentity切换到NetworkService。 希望这会使所有上述问题消失。 但我们不确定; 如果可能的话,我们希望切换回去。

我们的问题

上述假设是否正确,如果是的话,这是IIS / Windows / .NET中的一个错误吗? 在哪种情况下会发生这种主令牌损失?

通过Microsoft支持,我发现我们遇到了Microsoft知识库文章KB2545850中描述的问题。 这仅在使用ApplicationPoolIdentity时发生。 这很容易发生,即机器账号密码更改后(默认每30天自动发生一次),然后IIS重新启动(例如,通过iisreset )。 请注意,根据Microsoft和我们的观察,问题在重新启动后消失。

根据微软,不可能检查你的Windows / IIS是否已经进入这个状态。

Microsoft有一个修补程序附加到此知识库文章。 没有任何迹象表明该修补程序将被推入正式发货,并且该修补程序已经有10个月的时间了。 在我们的具体情况中,我们决定切换到NetworkService。

请参阅https://serverfault.com/a/403534/126432了解我对同一问题/解决scheme的评论。;

使用您链接的修补程序,允许我按照文档所说的那样获取ApplicationPoolIdentity。 此修补程序没有专门介绍一种以NT AUTHORITY \ ANONYMOUS LOGON访问networking资源的解决scheme,但它与计算机密码更改有关。 底线是,它至less为我工作,至less目前为止。

这对于使用Active Directoryauthentication的Umbraco也是相关的。 不时您可能会得到这个例外:

configuration错误

指定的目录服务属性或值不存在

这显然是由这里概述的问题造成的。 重新启动总是修复它。