如果有人有类似的故事,请在下面发布详细信息!
我正在构建一个需要支持LDAP身份验证的ASP.NET网站.
在Windows上,LDAP auth可以通过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 Object - 不是一件容易修复的东西.
这个 问题 不是 新的 或 未知的.有些人通过微软的支持得到了不同的结果; 基本上答案似乎归结为"采取你的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.
如果其他人有这些问题,请在下面发布,也许最终我们会找到一个模式可以使用或有足够数量的例子来说服微软解决这个问题.
虽然我无法准确找出导致此问题的原因,但似乎必须在迁移到非群集服务器后停止.
关于这个bug有其他奇怪的事实:
重新启动asp.net主机进程不足以解决问题.这很奇怪; 你希望操作系统强行释放过程死亡的资源
重新启动IIS服务不会释放资源(UDP端口).netstat显示端口似乎是免费的,但所有打开的端口实际上都是由进程#4 - 系统进程打开的.
杀死 IIS(例如通过IIS管理器)会释放UDP端口,然后再次进行身份验证.
总而言之,这看起来非常像win2k3中启用了群集的驱动程序或内核问题,而不是.NET相关问题.
因此,如果其他人偶然发现类似的问题,请检查群集是否已启用 - 这可能会让您免于数周的麻烦.