(这是一个关于模糊问题的问题.我试图提供所有相关数据,希望有人提供有用的信息;为长篇描述道歉.)
我们的网络应用
我们有一个在IIS 7.5中运行的.NET 4 Web应用程序,可以访问Active Directory和SQL Server数据库.
此Web应用程序在一个虚拟的"应用程序池标识"运行,通过设置应用程序的应用程序池的标识ApplicationPoolIdentity.可以在StackOverflow答案和它所引用的博客文章中找到虚拟身份的简明描述:应用程序池标识只是一个附加组,它被添加到作为"网络服务"运行的Web应用程序的工作进程中.但是,一位消息人士模糊地暗示"网络服务和ApplicationPoolIdentity确实存在IIS.net站点文档不发布的差异".因此,虚拟身份可能不仅仅是一个额外的群体.
我们选择使用ApplicationPoolIdentity而不是NetworkService,因为它成为IIS 7.5中的默认设置(参见,例如,此处),并且根据Microsoft的建议:"此身份允许管理员指定仅与应用程序所属身份相关的权限池正在运行,从而提高了服务器的安全性." (来自processModel元素,用于为applicationPools添加[IIS 7设置架构])"应用程序池标识是一个强大的新隔离功能","使运行的IIS应用程序更安全可靠."(来自IIS.net文章"应用程序池标识")
该应用程序使用集成Windows身份验证,但<identity impersonate="false"/>不是最终用户的身份,而是使用虚拟应用程序池标识来运行我们的代码.
此应用程序使用System.DirectoryServices类(即ADSI API)查询Active Directory .在大多数地方,这是在不指定其他用户名/密码或其他凭据的情况下完成的.
此应用程序还使用Integrated Security=true连接字符串连接到SQL Server数据库.如果数据库是本地的,那么我们看到IIS APPPOOL\OurAppPoolName用于连接数据库; 如果数据库是远程的,则使用计算机帐户OURDOMAIN\ourwebserver$.
我们的问题
我们经常遇到以下一种方式导致工作安装失败的问题.
当数据库位于远程系统上时,数据库连接开始失败:"用户登录失败'NT AUTHORITY\ANONYMOUS LOGON'.原因:基于令牌的服务器访问验证因基础结构错误而失败.检查以前的错误." 先前的错误是"错误:18456,严重性:14,状态:11." 所以似乎现在OURDOMAIN\ourwebserver$不再使用,而是尝试匿名访问.(我们有轶事证据表明UAC关闭时出现了这个问题,并且在打开UAC后它就消失了.但请注意,更改UAC需要重新启动......)IIS.net线程中报告了类似的问题"使用ApplicationPoolIdentity连接到SQL",特别是在一个回复中.
通过ADSI(System.DirectoryServices)的Active Directory操作开始失败,错误0x8000500C("未知错误"),0x80072020("发生操作错误.")或0x200B("指定的目录服务属性或值不存在") .
从Internet Explorer登录应用程序开始失败,出现HTTP 401错误.但是如果在IIS中我们然后在谈判之前放置NTLM然后再次工作.(请注意,Kerberos需要访问AD,但NTLM不需要访问AD.)IIS.net线程"使用AppPool标识失败的窗口身份验证"中报告了类似的问题.
我们的假设和解决方法
将应用程序池从ApplicationPoolIdentity切换到NetworkService时,至少AD和登录问题似乎总是消失.(我们发现有一份报告证实了这一点.)
页面"解决ASP页面上的身份验证问题"有一些与主要和次要令牌相关的建议,我发现它令人鼓舞的是它链接了我们的前两个错误:它提到了NT AUTHORITY\ANONYMOUS LOGON访问,AD错误0x8000500C和"指定的目录服务属性或值不存在". …
asp.net adsi active-directory iis-7.5 applicationpoolidentity
我无法找到ASP.NET 4应用程序失败的问题,同时尝试为给定用户获取用户组.与此应用程序关联的应用程序池设置为在ApplicationPoolIdentity下运行.
例外信息
System.DirectoryServices.DirectoryServicesCOMException
HRESULT: 80072020
Message: An operations error occurred.
Extended Message: 000004DC: LdapErr: DSID-0C0906E8, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v1db1
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
System.DirectoryServices.DirectoryEntry.Bind(Boolean)
System.DirectoryServices.DirectoryEntry.Bind()
System.DirectoryServices.DirectoryEntry.get_AdsObject()
System.DirectoryServices.DirectorySearcher.FindAll(Boolean)
System.DirectoryServices.DirectorySearcher.FindOne()
Run Code Online (Sandbox Code Playgroud)
95%-99%的时间,此功能正常,但有时,它只是开始失败.当我将应用程序池更改为使用LocalSystem或NetworkService时,它开始工作.当我改回ApplicationPoolIdentity时,它又开始失败了.使ApplicationPoolIdentity重新启动站点的唯一方法是重新启动服务器.
我在这里找到了类似的问题,但解决方案也是重启.我想找到一个更永久的解决方案,而不是改变应用程序池的身份.
我正在创建目录,并将文件写入我在Windows Server 2008上托管的Web应用程序中的共享文件夹.我正在运行具有ApplicationPoolIdentity标识的应用程序池.
到目前为止,为了让您了解我的设置..我已将我的Web应用程序根目录的根目录权限设置为两个不同的用户:"IUSR"和"IIS APPPOOL\MYPOOL".我使用名称"MYPOOL"作为我的应用程序池的名称,因此很容易引用.
应用程序无法修改和写入共享文件夹.我右键单击了我正在创建目录并写入的共享文件夹,然后单击"安全"选项卡.然后我点击了"编辑".在对象下,我检查了"计算机".然后在LOCATION下,我尝试了运行我的Web应用程序的机器/服务器.我无法在用户下找到我的"MYPOOL"用户.我试着按照这个链接,但它不是很完整.我不知道使用哪个用户.我继续获得System.IO异常,因为它没有权限.一旦我知道要使用哪个用户,我将不得不对"ExportPath"目录赋予"修改"权限.
为了进行快速测试,我创建了一个名为FilePermissionsTest.aspx的虚拟页面,并编写了一些代码来编写一个文件来创建一个目录并在后面的代码的Page_Load事件中编写一个文件.但我还没有足够的测试它.
...
<div>
Check to see if the file "_File_Permissions_Test.txt" was written to <% Response.Write(Data.ConfigurationHelper.ValueFromConfiguration("ExportPath", Nothing))%>
</div>
Run Code Online (Sandbox Code Playgroud)
...
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim exportPath As String = Data.ConfigurationHelper.ValueFromConfiguration("ExportPath", Nothing)
If exportPath = String.Empty Then Return
Dim exportDirectory As DirectoryInfo = Directory.CreateDirectory(exportPath)
Dim writer As StreamWriter = File.CreateText(Path.Combine(exportDirectory.FullName, "_File_Permissions_Test.txt"))
writer.WriteLine("TESTING... " + DateTime.Now().ToString)
writer.Flush()
writer.Close()
End Sub
Run Code Online (Sandbox Code Playgroud)