2010-06-30 46 views
0

我在嘗試診斷客戶端網站上運行的服務器應用程序的問題。所述應用程序針對AD環境中的域控制器驗證用戶憑證。我們看到的行爲是週期性的,用戶無法通過服務器進行身份驗證。疑難解答幫助:活動目錄綁定失敗

我們已經基本追溯了「綁定」失敗的失敗。爲了進一步診斷問題,我構建了一個超級簡單的工具,它執行兩種類型的綁定:一種使用LDAP服務器綁定,一種使用WinNT綁定。我們的服務器應用程序只執行LDAP綁定,但爲了添加控件,我向WinNT綁定中投擲。

 public static void DoWinNTBind(string domain, string login, string password) 
     { 
      Logger.Log("Starting WinNT Bind to {0}",domain); 
      try 
      { 
       var serverPath = String.Format("WinNT://{0}",domain); 

       Logger.Log("Creating DirectoryEntry object for {0} on domain {1}", login, serverPath); 
       using (DirectoryEntry de = new DirectoryEntry(serverPath, login, password, AuthenticationTypes.Secure | AuthenticationTypes.Sealing)) 
       { 

        if (!de.NativeObject.Equals(null)) 
        { 
         Logger.Log("WinNT Bind Success"); 
        } 
        else 
        { 
         Logger.Log("WinNT Bind Failed"); 
        } 
       } 
      } 
      catch(Exception ex) 
      { 
       Logger.Log("{0} occured during WinNT Bind: {1}",ex.GetType().Name,ex.Message); 
       Logger.Log("Stack: {0}",ex.StackTrace); 
      } 
     } 

     public static void DoLDAPBind(string domain,string login, string password) 
     { 
      Logger.Log("Starting LDAP Bind to {0}",domain); 
      try 
      { 
       var serverPath = String.Format("LDAP://{0}",domain); 

       Logger.Log("Creating DirectoryEntry object for {0} on domain {1}", login, serverPath); 
       using (DirectoryEntry de = new DirectoryEntry(serverPath, login, password, AuthenticationTypes.Secure | AuthenticationTypes.Sealing)) 
       { 

        if (!de.NativeObject.Equals(null)) 
        { 
         Logger.Log("LDAP Bind Success"); 
        } 
        else 
        { 
         Logger.Log("LDAP Bind Failed"); 
        } 
       } 
      } 
      catch(Exception ex) 
      { 
       Logger.Log("{0} occured during LDAP Bind: {1}",ex.GetType().Name,ex.Message); 
       Logger.Log("Stack: {0}",ex.StackTrace); 
      } 
     } 

正如您所看到的,除了使用System.DirectoryServices.DirectoryEntry連接到DC之外,沒有太多的代碼。

生成的日誌文件是(名稱和域掩碼)。

6/29/2010下午2點52分17秒:執行AD 結合爲USER1 6/29/2010下午2點52分17秒: 開始LDAP綁定到XXX.XXX 6/29/2010 02:52:17 PM:創建 域上的DirectoryEntry對象 LDAP://xxx.xxx 6/29/2010 2:52:17 PM: 在LDAP綁定期間DirectoryServicesCOMException發生 :登錄失敗: 未知的用戶名或密碼錯誤。

6/29/2010下午2時52分17秒:堆棧:在 System.DirectoryServices.DirectoryEntry.Bind(布爾 throwIfFail)在 System.DirectoryServices.DirectoryEntry.Bind() 在 的System.DirectoryServices。 DirectoryEntry.get_NativeObject() 在 AdmitOne.Superglue.ActiveDirectoryHelper.DoLDAPBind(字符串 域,字符串登錄,字符串密碼) 在 C:\項目\加拉帕戈斯\分支\合同\ 2.0_SN_Peer \ SRC \工具\強力膠\ ActiveDirectoryHelper .cs:行 47 6/29/2010 2:52:17 PM:開始 WinNT與xxx.xxx綁定2010年6月29日 下午2時52分17秒:在域 創建的DirectoryEntry 對象USER1 WINNT://xxx.xxx 6/29/2010下午2時52分18秒: WINNT綁定成功

所以相同的用戶名稱無法使用LDAP綁定,但成功使用WinNT!

本地在我們的測試環境中,我們沒有看到這種行爲,LDAP和WinNT都沒有問題成功。

所以我卡住了。我想說這是他們的廣告環境的一個問題,但沒有吸菸槍,我不能。

我第一次詢問Stack,以確保我的綁定代碼是正確的。之後,我可能需要在Serverfault上進行重新評估,這是更適合尋求AD特定問題的地方。

回答

0

事實證明,這不是一個代碼問題,而是客戶的AD環境存在Kerberos問題。

具體而言,安全/密封標誌指示LDAP提供者僅使用Kerberos來安全地協商身份驗證。

由於Kerberos不受WinNT提供程序支持,因此不存在與WinNT提供程序綁定的問題。