我正在构建一个需要支持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相关问题.
因此,如果其他人偶然发现类似的问题,请检查群集是否已启用 – 这可能会让您免于数周的麻烦.