.net – 为什么使用DirectoryEntry对LDAP进行身份验证会间歇性地抛出COMException(0x8007203A):“服务器无法运行”?

前端之家收集整理的这篇文章主要介绍了.net – 为什么使用DirectoryEntry对LDAP进行身份验证会间歇性地抛出COMException(0x8007203A):“服务器无法运行”?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_0@
如果有人有类似的故事,请在下面发布详细信息!

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

Windows上,可以通过Active Directory执行LDAP身份验证(我不是专家,但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 Object – 不是一件容易修复的事情.

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,c=org"

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

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

解决方法

虽然我无法准确找出导致此问题的原因,但似乎必须在迁移到非群集服务器后停止.

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

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

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

因此,如果其他人偶然发现类似的问题,请检查群集是否已启用 – 这可能会让您免于数周的麻烦.

猜你在找的asp.Net相关文章