2010-06-30 3 views
0

클라이언트 사이트에서 실행되는 서버 응용 프로그램의 문제를 진단하려고합니다. 이 응용 프로그램은 AD 환경의 도메인 컨트롤러에 대한 사용자 자격 증명을 인증합니다. 우리가보고있는 동작은 주기적으로 사용자가 서버를 통해 인증 할 수 없다는 것입니다.문제 해결 도움말 : Active Directory 바인딩 실패

우리는 본질적으로 "바인딩"실패 실패를 추적했습니다. 문제를 더 진단하기 위해 필자는 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를 사용하는 것보다 다른 많은 코드가 없습니다.

결과 로그 파일은 (이름과 도메인이 마스크 된)입니다.

2010년 6월 29일 오후 2시 52분 17초 : LDAP 바인드가 2010년 6월 29일을에 xxx.xxx하기 시작 : AD 을 수행하면 사용자 1 2010년 6월 29일 오후 2시 52분 17초에 대한 결합 오후 2시 52분 17초 : 도메인 LDAP에 대한 하여 DirectoryEntry 개체를 만들기 : //xxx.xxx 2010년 6월 29일 오후 2시 52분 17초 : DirectoryServicesCOMException이 LDAP 바인드 동안 을 발생 : 로그온 실패 : 알 수없는 사용자 이름 또는 잘못된 암호.

2010년 6월 29일 오후 2시 52분 17초 : 스택 : System.DirectoryServices에서 System.DirectoryServices.DirectoryEntry.Bind System.DirectoryServices.DirectoryEntry.Bind에서 (부울 throwIfFail)() 에서. AdmitOne.Superglue.ActiveDirectoryHelper.DoLDAPBind에서 DirectoryEntry.get_NativeObject() (문자열 도메인 문자열 로그인, 문자열 암호) C 에서 : 프로젝트 \ \ 갈라파고스 \ 가지가 계약 \ 2.0_SN_Peer \ SRC \ 도구 \ \ Superglue \ ActiveDirectoryHelper .cs : line 47 6/29/2010 2:52:17 PM : 시작 WinNT xxx.xxx에 바인드 2010/06/29 오후 2시 52분 17초 : Winnt는 도메인 에 User1의하여 DirectoryEntry 객체를 만들기 : 그래서 Winnt는 바인드 성공

동일한 사용자 : 2010년 6월 29일 오후 2시 52분 18초 //xxx.xxx name은 LDAP를 사용하여 바인딩하지 못하지만 WinNT를 사용하여 성공합니다!

로컬에서는 테스트 환경에서이 동작이 나타나지 않지만 LDAP와 WinNT는 문제없이 성공합니다.

그래서 막혀 있습니다. 나는 그들의 광고 환경에 문제가 있다고 말하고 싶지만, 흡연 총이 없으면 나는 할 수 없다.

제 바인드 코드가 올바른지 확인하기 위해 먼저 스택을 요청하고 있습니다. 그 후, 아마 AD 특정 문제를 요청하는 더 적절한 장소 인 Serverfault에 대해 다시 조사해야 할 것입니다.

답변

0

이것은 코드 문제가 아니라 고객의 광고 환경이 Kerberos에 문제가있는 것으로 나타났습니다.

특히 보안/봉인 플래그는 LDAP 공급자에게 Kerberos 만 사용하여 인증을 안전하게 협상하도록 지시합니다.

Kerberos는 WinNT 공급자가 지원하지 않으므로 WinNT 공급자와 바인딩 할 때 문제가 없습니다.