.net - 为什么使用 DirectoryEntry 对 LDAP 进行身份验证会间歇性地抛出 COMException (0x8007203A) : "The server is not operational"?

标签 .net asp.net com ldap

如果有人有类似的故事,请在下面发布详细信息!

我正在构建一个需要支持 LDAP 身份验证的 ASP.NET 网站。

在 Windows 上,LDAP 身份验证可以通过 Active Directory 执行(我不是专家,但 AD 似乎只是 ldap 的一种特殊形式)。我不控制 AD 和/或 LDAP 服务器。

我尝试了各种身份验证方法,但我决定使用一个 DirectoryEntry每次身份验证尝试:

using (DirectoryEntry de = new DirectoryEntry(ldapPath, ldapUsername, password, AuthenticationTypes.ServerBind)) {
    try {
        // Bind to the native AdsObject to force authentication.
        object obj = de.NativeObject;//not IDisposable
    } catch(...

检索 NativeObject 会导致 COMException如果出现任何问题,例如如果身份验证失败,则异常类似于“登录失败:未知用户名或密码错误”,如果 ldap 服务器无法访问或超时,则类似于“服务器无法运行。 ”

这基本上有效,但是在可变天数之后,总是在早上开始第一件事,我们得到“服务器无法运行”。直到 IIS 重新启动。这显然不是一个很好的长期解决方案,但据我所知,故障在于 DirectoryEntry 底层的 Com 对象 - 不容易修复。

This problem isn't new or unknown .有些人经历了微软的支持,结果喜忧参半;基本上答案似乎归结为“采用您的 ldap 路径并创建一些等效的替代方案,也许其中之一会起作用”。每次尝试,或者当然,几天后您都不会知道它是否真的有效,直到找到真正的解决方案,我们又回到“每晚重新启动 Windows 服务器”。

首先,我尝试了以下格式的 ldap 路径
* "LDAP://server.uri:636"
* "LDAP://insecure.server.uri:389"
* "LDAP://server.uri:636/cn=username,ou=staff,o=myOrganisation,c=org"

始终使用具有以下模式的用户名:
* "cn=username,ou=staff,o=myOrganisation,c=org"

所有这些方法最初都有效,但在可变天数后失败(并在 IIS 重置后开始工作)。服务器在 win 2k3 上运行 IIS6。

如果其他人有这些问题,请在下面发帖,也许最终我们会找到一个可以使用的模式或有足够数量的例子来说服微软解决这个问题。

最佳答案

虽然我不能准确地查明这个问题的原因,但它似乎在迁移到非集群服务器后停止了。

关于这个错误还有其他奇怪的事实:

  • 重新启动 asp.net 主机进程不足以解决问题。这很奇怪;您希望操作系统在进程死亡时强制释放资源
  • 重新启动 IIS 服务不会释放资源(UDP 端口)。 netstat 显示端口似乎是空闲的,但所有打开的端口实际上都是由进程 #4 - System 进程打开的。
  • 杀死 IIS(例如通过 IIS 管理器)确实会释放 UDP 端口,然后身份验证再次起作用。

  • 总而言之,这看起来很像启用了集群的 win2k3 中的驱动程序或内核问题,而不是与 .NET 相关的问题。

    因此,如果其他人遇到类似问题,请检查是否启用了聚类 - 这可能会为您节省数周的麻烦。

    关于.net - 为什么使用 DirectoryEntry 对 LDAP 进行身份验证会间歇性地抛出 COMException (0x8007203A) : "The server is not operational"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1158099/

    相关文章:

    c# - 如何通过 ASP.NET API 使用 SQL Azure 数据库?

    asp.net - 在 WCF 服务中触发 IIS AppPool 回收

    c# - LINQ2SQL : How do I declare a member variable of type var?

    c# - 当我只知道祖先类的类型时,如何反序列化 XML?

    c# - FileHelpers:混合分隔和固定长度记录

    c++ - 如何确定内存中的 COM 对象大小?

    .net - 在 2 台机器上生成的 .tlh 不同

    c# - 具有通用类型约束和继承类型的通用类定义?

    asp.net - 如何将种子数据放入SQL Server docker镜像中?

    c++ - 如何确定进程外COM服务器支持的线程模型?