6

介绍

我正在维护一个查询 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 的调试器中的样子:

图像显示 DirectoryServicesCOMException,其 ExtendedErrorMessage 属性设置为 000004DC:LdapErr:DSID-0C0906E8,注释:为了执行此操作,必须在连接上完成成功绑定。,数据 0,v1db1

什么有效

我找到了一些解决方法来完成这项工作,但我没有一个可以接受:

  1. 禁用集成 Windows 身份验证,而是使用基本身份验证
  2. 在 IIS 中,在 ASP.NET 2.0 下使用Network Service帐户和 ASP.NET impersonation disabled运行应用程序。
  3. 仅从 Web 服务器访问应用程序,使用localhost作为主机名。
  4. 在 web.config 中使用带有硬编码帐户的 ASP.NET 模拟。

什么不起作用

我从互联网上找到了一些建议,但没有一个能完全解决问题:

  1. 使用HostingEnvironment.Impersonate().
  2. 禁用模拟。

我想要的是

我希望无需在 Active Directory 中重新配置任何内容即可完成这项工作。它在如上所示的某些 IIS 配置下工作正常,所以我相信应该可以通过重新配置应用程序或 IIS 来使其工作(更改 .NET 框架版本除外)。

4

1 回答 1

3

我相信这个问题有多种原因:

  1. 使用 ASP.NET 模拟。
  2. 在 ASP.NET 4.0 应用程序池下运行 ASP.NET 3.5 应用程序。

要解决第二个问题,请将应用程序升级到 ASP.NET 4.0 或将 IIS 配置为使用 ASP.NET 2.0。

于 2013-06-17T01:07:03.093 回答