2009-12-03 4 views
2

Nous avons récemment eu un problème avec notre serveur de test LDAP - il était bloqué et ne répondait pas aux demandes. En conséquence, notre application a été suspendue pour toujours * tout en essayant de lier à elle. Cela s'est produit uniquement sur les machines Unix. Sous Windows, l'appel ldap_simple_bind_s a expiré après environ 30 secondes.Comment faire pour que ldap_simple_bind_s expire?

* Je ne sais pas si c'était vraiment , mais c'était au moins plusieurs minutes.

J'ai ajouté des appels à ldap_set_option, en essayant à la fois LDAP_OPT_TIMEOUT et LDAP_OPT_NETWORK_TIMEOUT, mais l'appel de liaison toujours bloqué. Yat-il un moyen de faire ldap_simple_bind_s temps après une certaine période de temps de mon choix?

Répondre

1

Il y a quelques choses qui se passent ici.

Fondamentalement, le SDK LDAP est cassé; en fonction de la spécification, il aurait dû expirer en fonction de la valeur que vous avez envoyée dans ldap_set_option. Malheureusement, il ne le fait pas correctement. Votre bind finira probablement par expirer, mais il ne sera pas jusqu'à ce que le système d'exploitation renvoie un échec, et cela viendra du délai TCP ou de plusieurs fois de ce délai.

Vous pouvez contourner ce problème en utilisant ldap_simple_bind(), puis en appelant ldap_result() plusieurs fois. Si vous ne récupérez pas le résultat dans le délai que vous souhaitez, vous pouvez appeler ldap_abandon_ext() pour indiquer au SDK d'abandonner.

Bien sûr, puisque vous essayez de lier cela, la connexion sera certainement inutilisable et vous aurez besoin de la déconnecter immédiatement.

Espérons que cela aide.

+0

Merci - Je ne sais pas pourquoi utiliser la version asynchrone de la fonction ne se produit pas pour moi, mais que le problème résolu. –

0

MISE À JOUR: le code ci-dessous ne fonctionne que sur openldap 2.4+. openLdap 2.3 n'honore pas LDAP_OPT_TIMEOUT sans lequel ldap_simple_bind_s ne passera pas de temps sans tenir compte de ce que vous avez défini. Voici le link du forum OpenLDAP

J'utilise Ldap_simple_bind_s dans mon service LDAP auth, et avec la mise en LDAP_OPT_TIMEOUT, LDAP_OPT_TIMELIMIT et LDAP_OPT_NETWORK_TIMEOUT; il expire avec succès si le serveur LDAP est indisponible.

Voici l'extrait de code de mon LDAP Connect Méthode:

int opt_timeout  = 4;    // LDAP_OPT_TIMEOUT 
    int timelimit  = 4;    // LDAP_OPT_TIMELIMIT 
    int network_timeout = 4;    // LDAP_OPT_NETWORK_TIMEOUT 
    int status = 0; 

     // Set LDAP operation timeout(synchronous operations) 

     if (opt_timeout > 0) 
     { 

      struct timeval optTimeout; 
      optTimeout.tv_usec = 0; 
      optTimeout.tv_sec = opt_timeout; 

      status = ldap_set_option(connection, LDAP_OPT_TIMEOUT, (void *)&optTimeout); 
      if (status != LDAP_OPT_SUCCESS) 
      { 
       return false; 
      } 
     } 

     // Set LDAP operation timeout 
     if (timelimit > 0) 
     { 
      status = ldap_set_option(connection, LDAP_OPT_TIMELIMIT, (void *)&timelimit); 
      if (status != LDAP_OPT_SUCCESS) 
      { 
       return false; 
      } 
     } 

     // Set LDAP network operation timeout(connection attempt) 
     if (network_timeout > 0) 
     { 
      struct timeval networkTimeout; 
      networkTimeout.tv_usec = 0; 
      networkTimeout.tv_sec = network_timeout; 

      status = ldap_set_option(connection, LDAP_OPT_NETWORK_TIMEOUT, (void *)&networkTimeout); 
      if (status != LDAP_OPT_SUCCESS) 
      { 
       return false; 
      } 
     } 
Questions connexes