从 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)的主要内容,如果未能解决你的问题,请参考以下文章
带有 Active Directory 的 ASP.NET:用户凭据
由 Azure Active Directory v1 保护的 asp.net 核心 webapi
ASP.NET 表单身份验证和 Active Directory 模拟