介绍
我正在维护一个查询 Active Directory 的旧 ASP.NET 3.5 应用程序。该应用程序使用“集成 Windows 身份验证”,旨在使用其自己的安全上下文而不是专用的用户名和密码连接到 Active Directory。
这是相关的代码。
using (DirectoryEntry root = new DirectoryEntry())
using (DirectorySearcher searcher = new DirectorySearcher(root))
{
searcher.Filter = string.Format("(&(samAccountName={0})(objectClass=user)(objectCategory=person))", userName.Trim());
SearchResultCollection results = searcher.FindAll();
}
尽管它使用 ASP.NET 3.5,但由于现有的基础架构限制,它需要可从 ASP.NET 4.0 应用程序池运行。
问题
在某些情况下,调用会FindAll
引发以下异常:
System.DirectoryServices.DirectoryServicesCOMException (0x80072020):发生操作错误。
当我使用 Visual Studio 调试器检查异常对象时,该ExtendedErrorMessage
属性包含更详细的信息:
000004DC:LdapErr:DSID-0C0906E8,注释:为了执行此操作,必须在连接上完成成功的绑定。,数据 0,v1db1
以下屏幕截图显示了这在 Visual Studio 的调试器中的样子:
什么有效
我找到了一些解决方法来完成这项工作,但我没有一个可以接受:
- 禁用集成 Windows 身份验证,而是使用基本身份验证。
- 在 IIS 中,在 ASP.NET 2.0 下使用Network Service帐户和 ASP.NET impersonation disabled运行应用程序。
- 仅从 Web 服务器访问应用程序,使用localhost作为主机名。
- 在 web.config 中使用带有硬编码帐户的 ASP.NET 模拟。
什么不起作用
我从互联网上找到了一些建议,但没有一个能完全解决问题:
- 使用
HostingEnvironment.Impersonate()
. - 禁用模拟。
我想要的是
我希望无需在 Active Directory 中重新配置任何内容即可完成这项工作。它在如上所示的某些 IIS 配置下工作正常,所以我相信应该可以通过重新配置应用程序或 IIS 来使其工作(更改 .NET 框架版本除外)。