代码之家  ›  专栏  ›  技术社区  ›  Community wiki

为什么使用DirectoryEntry对LDAP进行身份验证会间歇性地抛出COMException(0x8007203A):“服务器不可操作”?

  •  8
  • Community wiki  · 技术社区  · 1 年前

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

    我正在构建一个需要支持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重置后开始工作)。服务器正在win2k3上运行IIS6。

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

    3 回复  |  直到 15 年前
        1
  •  5
  •   Eamon Nerbonne    15 年前

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

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

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

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

    因此,如果其他人遇到类似的问题,请检查是否启用了集群——这可能会让你省去数周的麻烦。

        2
  •  1
  •   marita    13 年前
        3
  •  0
  •   sys_debug    13 年前

    我读到一些关于与 NETSTAT 以及检查活动连接的状态。TIME WAIT倍数可能表示端口重定向有问题。尽管如此,在过去的三天里,我还是犯了同样的错误。我已经要求网络管理员修改我的权限,即使这样也无济于事。 文章对此进行了更详细的讨论: C# .NET Application looses Connection to the Active Directory