从 ASP.NET 应用程序使用 Active Directory 时出现 DirectoryServicesCOMException (0x80072020)

Posted

技术标签:

【中文标题】从 ASP.NET 应用程序使用 Active Directory 时出现 DirectoryServicesCOMException (0x80072020)【英文标题】:DirectoryServicesCOMException (0x80072020) when using Active Directory from ASP.NET application 【发布时间】: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 的调试器中的样子:

什么有效

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

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

什么不起作用

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

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

我想要什么

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

【问题讨论】:

【参考方案1】:

我认为问题有多种原因:

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

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

【讨论】:

以上是关于从 ASP.NET 应用程序使用 Active Directory 时出现 DirectoryServicesCOMException (0x80072020)的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Active Directory 自动登录

带有 Active Directory 的 ASP.NET:用户凭据

由 Azure Active Directory v1 保护的 asp.net 核心 webapi

ASP.NET 表单身份验证和 Active Directory 模拟

在 ASP.NET Core 2.0 中使用带有身份模型的 Azure Active Directory OAuth

如何在 Active Directory 中获取用户的组? (c#, asp.net)