首页 文章

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

提问于
浏览
59

(这是一个关于模糊问题的问题 . 我试图提供所有相关数据,希望有人提供有用的信息;为长篇描述道歉 . )

Our web app

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

通过将应用程序的应用程序池的标识设置为ApplicationPoolIdentity,此Web应用程序在虚拟'app pool identity'下运行 . 有关虚拟身份的简要说明,请参阅a StackOverflow answer,以及它所引用的博客文章:应用程序池标识只是添加到Web应用程序's worker processes which is running as '网络服务的附加组 . 然而,one source含糊地暗示"Network Service and ApplicationPoolIdentity do have differences that IIS.net site documents do not publish."因此,虚拟身份可能不仅仅是一个额外的群体 .

我们选择使用ApplicationPoolIdentity,而不是NetworkService,因为它成为IIS 7.5中的默认值(参见,例如,here),并且根据Microsoft的建议:"This identity allows administrators to specify permissions that pertain only to the identity under which the application pool is running, thereby increasing server security."(来自processModel Element for add for applicationPools [IIS 7 Settings Schema])"Application Pool Identities are a powerful new isolation feature","make running IIS applications even more secure and reliable. "(来自IIS.net article "Application Pool Identities"

该应用程序使用集成Windows身份验证,但使用<identity impersonate="false"/>,因此不是最终用户的身份,而是使用虚拟应用程序池标识来运行我们的代码 .

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

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

Our problems

我们经常遇到以下一种方式导致工作安装失败的问题 .

  • 当数据库在远程系统上时,数据库连接开始失败:"Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'. Reason: Token-based server access validation failed with an infrastructure error. Check for previous errors."上一个错误是"Error: 18456, Severity: 14, State: 11."所以现在似乎不再使用 OURDOMAIN\ourwebserver$ ,而是尝试进行匿名访问 . (我们有轶事证据表明UAC关闭时出现了这个问题,并且在开启UAC后它就消失了 . 但请注意,更改UAC需要重新启动...)IIS.net thread "use ApplicationPoolIdentity to connect to SQL"中报告了类似的问题,特别是在one reply中 .

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

  • 从Internet Explorer登录应用程序开始失败,出现HTTP 401错误 . 但是如果在IIS中我们然后在谈判之前放置NTLM然后再次工作 . (请注意,Kerberos需要访问AD,但NTLM不需要访问AD . )IIS.net thread "Window Authentication Failing with AppPool Identity"中报告了类似的问题 .

Our hypothesis and workaround

将应用程序池从ApplicationPoolIdentity切换到NetworkService时,至少AD和登录问题似乎总是消失 . (我们发现one report证实了这一点 . )

页面"Troubleshooting Authentication Problems on ASP Pages"有一些与主要和次要令牌相关的建议,我发现它令人鼓舞的是它链接了我们的前两个错误:它提到了 NT AUTHORITY\ANONYMOUS LOGON 访问,AD错误0x8000500C和"The specified directory service attribute or value does not exist" .

(同一页面也提到了ADSI架构缓存问题,但我们在该主题上找到的所有内容都是旧的 . 现在我们认为这是无关的 . )

基于以上所述,我们当前的工作假设是,只有在虚拟应用程序池标识下运行时,我们的Web应用程序(IIS?工作进程?)突然丢失其主令牌,因此IIS只有一个辅助令牌,所以所有匿名访问Active Directory和SQL Server会导致上述所有错误 .

目前我们打算从ApplicationPoolIdentity切换到NetworkService . 希望这会使上述所有问题都消失 . 但我们不确定;我们想尽可能转回去 .

Our question

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

3 回答

  • 2

    通过Microsoft支持,我发现我们遇到了Microsoft Knowledge Base article KB2545850中描述的问题 . 这仅在使用ApplicationPoolIdentity时发生 . 它很容易发生,即在更改机器帐户密码后(默认情况下每30天自动发生一次),然后重新启动IIS(例如,通过 iisreset ) . 请注意,根据微软和我们的观察,重启后问题就会消失 .

    根据Microsoft的说法,无法检查您的Windows / IIS是否已进入此状态 .

    Microsoft在此知识库文章中附加了一个修补程序 . 没有迹象表明该修补程序何时将进入官方发布,并且该修补程序已经有10个月了 . 在我们的具体情况中,我们决定改用NetworkService .

  • 35

    有关同一问题/解决方案的评论,请参阅https://serverfault.com/a/403534/126432 .

    使用您链接的修补程序允许我使ApplicationPoolIdentity工作,因为文档说它应该 . 此修补程序没有具体描述用于访问网络资源的解决方案,如NT AUTHORITY \ ANONYMOUS LOGON,但它与计算机密码更改有关 . 最重要的是它至少对我有用 .

  • 0

    这对于使用Active Directory身份验证的Umbraco也很重要 . 有时您可能会遇到以下异常:

    配置错误

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

    这显然是由这里概述的问题引起的 . 重启总是修复它 .

相关问题