(这是一个关于一个模糊问题的问题.我试图展示所有相关数据,希望有人能提供有用的信息;对于冗长的描述,我深表歉意.)

Our web app

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

通过将应用程序的应用程序池标识设置为ApplicationPoolIdentity,此web应用程序在虚拟"应用程序池标识"下运行.关于虚拟身份的简要描述可以在a StackOverflow answer和它所指的博客帖子中找到:应用程序池身份只是添加到web应用程序的工作进程(作为"网络服务"运行)中的一个附加组.然而,one source模糊地暗示"网络服务和ApplicationPoolIdentity确实存在差异,IIS.net网站文档不会发布."因此,虚拟身份可能不仅仅是一个额外的群体.

我们 Select 使用ApplicationPoolIdentity,而不是NetworkService,因为它成为了IIS 7.5中的默认设置(请参见,例如,here),并且符合Microsoft的建议:"此标识允许管理员指定仅与应用程序池运行时使用的标识相关的权限,从而提高服务器安全性."(摘自processModel Element for add for applicationPools [IIS 7 Settings Schema])"应用程序池身份是一个强大的新隔离功能",它"使运行的IIS应用程序更加安全可靠"(摘自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

我们经常会遇到这样的问题:一个正常工作的安装开始以以下方式之一出现故障.

  • 当数据库位于远程系统上时,数据库连接开始失败:"用户"NT AUTHORITY\ANONYMOUS LOGON"登录失败.原因:基于令牌的服务器访问验证失败,出现基础 struct 错误.请判断以前的错误."前一个错误是"错误:18456,严重性:14,状态:11"因此,现在OURDOMAIN\ourwebserver$似乎不再使用,而是try 匿名访问.(我们有轶事证据表明,这个问题发生在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不需要.)据报道,IIS.net thread "Window Authentication Failing with AppPool Identity"例患者也有类似问题.

Our hypothesis and workaround

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

"Troubleshooting Authentication Problems on ASP Pages"页提供了一些与主令牌和次令牌相关的建议,我发现令人鼓舞的是,它将我们的前两个错误联系起来:它提到NT AUTHORITY\ANONYMOUS LOGON访问,以及广告错误0x8000500C和"指定的目录服务属性或值不存在".

(同一页也提到了ADSI模式缓存问题,但是我们在这个主题上发现的所有东西都是旧的.现在我们认为这是无关的.)

基于以上,我们目前的工作hypothesis是,只有在虚拟应用池身份下运行时才有our web application (IIS? worker process?) suddenly loses its primary token,使得IIS只有一个二级令牌,使得所有对Active Directory和SQL Server的访问都是匿名进行的,导致了上述所有错误.

目前,我们打算从ApplicationPoolIdentity切换到NetworkService.希望这能解决上述所有问题.但我们不确定;如果可能的话,我们想换回go .

Our question

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

推荐答案

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

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

微软在这篇KB文章中附加了一个修补程序.目前还没有迹象表明该修补程序何时会正式发布,而且该修补程序已经发布了10个月.在我们的具体 case 中,我们决定改用NetworkService.

Asp.net相关问答推荐

如何删除字符串的定义部分?

登录成功后 User.Identity.IsAuthenticated 为 false

如何缓存数据库表以防止在 Asp.net C# mvc 中出现许多数据库查询

ASP.NET 控件无法在 Visual Studio 2008 的代码隐藏中引用

使用 jQuery.ajax() 时如何处理错误?

区分开发、登台和生产环境之间的 web.config

System.Linq.Dynamic 不支持 OrderByDescending("someColumn")?

如何使用自动生成的列隐藏 ASP.NET GridView 中的列?

ASP.net 与 PHP( Select 什么)

如何配置 ELMAH 以使用 Windows Azure?我在 Elmah.axd 上得到 404

错误请求 - 无效的主机名 ASP.net Visual Studio 2015

使用 VirtualPathProvider 从 DLL 加载 ASP.NET MVC 视图

在 Asp.Net Core 中动态更改连接字符串

如何使用 jquery 设置单选按钮 Select 的值

使用 NLog 在 ASP.NET Web API 2.1 中进行全局异常处理?

System.Linq.IQueryable 不包含Where的定义

在.net的内存数据库中

ASP.NET 5 (vNext) - 获取配置设置

判断 IQueryable 结果集的最佳方法是什么?

RegisterStartupScript 不适用于 ScriptManager、Updatepanel.这是为什么?