【问题标题】:DirectoryServicesCOMException (0x80072020) when using Active Directory from ASP.NET application从 ASP.NET 应用程序使用 Active Directory 时出现 DirectoryServicesCOMException (0x80072020)
【发布时间】:2013-06-14 07:14:42
【问题描述】:

简介

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

什么有效

我找到了一些解决方法来完成这项工作,但我都无法接受:

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

什么不起作用

我从网上找了一些建议,但都没有完全解决问题:

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

我想要什么

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

【问题讨论】:

    标签: asp.net active-directory windows-authentication


    【解决方案1】:

    我认为问题有多种原因:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      相关资源
      最近更新 更多