簡體   English   中英

為什么使用DirectoryEntry對LDAP進行身份驗證會間歇性地拋出COMException(0x8007203A):“服務器無法運行”?

[英]Why does authenticating against LDAP with DirectoryEntry intermittently throw COMException (0x8007203A): “The server is not operational”?

如果有人有類似的故事,請在下面發布詳細信息!

我正在構建一個需要支持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相關問題。

因此,如果其他人偶然發現類似的問題,請檢查群集是否已啟用 - 這可能會讓您免於數周的麻煩。

我讀了一些關於使用NETSTAT進行檢查並檢查活動連接狀態的內容。 TIME WAIT倍數可能表示端口重定向問題。 盡管如此,我在過去3天內收到同樣的錯誤。 我已經要求網絡管理員修改我的權限,甚至沒有幫助。 文章更詳細地討論了這個問題: C#.NET應用程序丟失了與Active Directory的連接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM