2010-06-30 2 views
0

J'essaye de diagnostiquer un problème avec une application serveur s'exécutant sur un site client. Cette application authentifie les informations d'identification de l'utilisateur par rapport à un contrôleur de domaine dans un environnement AD. Le comportement que nous voyons est périodiquement aucun utilisateur ne peut s'authentifier via le serveur.Résolution des problèmes Aide: Liaison Active Directory échoue

Nous avons essentiellement retracé l'échec de l'échec "bind". Pour mieux diagnostiquer le problème, j'ai construit un outil super simple qui fait deux types de liaisons: l'une utilisant une liaison serveur LDAP, et l'autre utilisant la liaison WinNT. Notre application serveur ne fait que lier LDAP, mais pour ajouter un contrôle, j'ai jeté la liaison 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); 
      } 
     } 

Comme vous pouvez le voir, il n'y a pas beaucoup de code autre que d'utiliser System.DirectoryServices.DirectoryEntry pour se connecter à un courant continu.

Le fichier journal résultant est (nom et domaine masqué).

6/29/2010 2:52:17 PM: Exécution AD se fixe pour user1 6/29/2010 14:52:17: A partir Bind LDAP xxx.xxx 6/29/2010 2:52:17 PM: Création objet DirectoryEntry pour le domaine LDAP: //xxx.xxx 6/29/2010 2:52:17 PM: DirectoryServicesCOMException est survenue lors de LDAP Bind: échec de la connexion: nom d'utilisateur inconnu ou mauvais mot de passe.

6/29/2010 2:52:17 PM: Stack: à System.DirectoryServices.DirectoryEntry.Bind (Boolean throwIfFail) à System.DirectoryServices.DirectoryEntry.Bind() à System.DirectoryServices. DirectoryEntry.get_NativeObject() à AdmitOne.Superglue.ActiveDirectoryHelper.DoLDAPBind (String domain , connexion à cordes, mot de passe String) dans C: \ Projects branches \ \ \ Galapagos contrat \ 2.0_SN_Peer \ Src \ Tools \ Superglue \ ActiveDirectoryHelper .cs: ​​ligne 47 6/29/2010 2:52:17 PM: Commencer WinNT Lier à xxx.xxx 6/29/2010 14:52:17: Création DirectoryEntry objet pour user1 sur le domaine WinNT: //xxx.xxx 6/29/2010 14:52:18: WinNT Bind Succès

Ainsi, le même utilisateur name ne parvient pas à lier en utilisant LDAP, mais réussit à utiliser WinNT!

Localement dans notre environnement de test, nous ne voyons pas ce comportement, LDAP et WinNT réussissent sans problèmes.

Donc, je suis bloqué. Je voudrais dire que c'est un problème avec leur environnement AD, mais sans un pistolet fumant, je ne peux pas.

Je demande d'abord sur Stack, pour m'assurer que mon code de liaison est correct. Après quoi, je devrai probablement me pencher sur Serverfault, qui est l'endroit le plus approprié pour poser des questions spécifiques à AD.

Répondre

0

Il s'avère que ce n'est pas un problème de code, mais que l'environnement AD du client rencontre des problèmes avec Kerberos. Plus précisément, les indicateurs Secure/Sealing indiquent au fournisseur LDAP d'utiliser uniquement Kerberos pour négocier l'authentification de façon sécurisée.

Étant donné que Kerberos n'est pas pris en charge par le fournisseur WinNT, il n'existe aucun problème de liaison avec le fournisseur WinNT.