2009-07-20 4 views
2

J'ai ce petit problème. Je veux authentifier l'utilisateur contre LDAP (Windows Active Directory), tout fonctionne bien, mais la combinaison (bon utilisateur, bon mot de passe, mauvais domaine).ldap_bind_s renvoyant LDAP_SUCCESS avec des informations d'identification incorrectes

LDAP* ldap = ldap_init(L"myserver", 389); 
ULONG ldap_version = 3; 

ULONG ret = LDAP_SUCCESS; 

ret = ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, (void*)&ldap_version); 
ret = ldap_connect(ldap, NULL); 

SEC_WINNT_AUTH_IDENTITY ai; 
ai.Domain = (unsigned short*)BAD_DOMAIN; 
ai.DomainLength = wcslen(BAD_DOMAIN); 
ai.User = (unsigned short*)OK_USER; 
ai.UserLength = wcslen(OK_USER); 
ai.Password = (unsigned short*)OK_PASS; 
ai.PasswordLength = wcslen(OK_PASS); 
ai.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; 

ret = ldap_bind_s(ldap, NULL, (PWCHAR) &ai, LDAP_AUTH_NTLM); // !!! HERE !!! 
ret = ldap_unbind_s(ldap); 

Sur la ligne marke '!!! ICI !!!' Je m'attendrais à 0x31 ou à toute autre erreur retournée. Au lieu de cela, je me LDAP_SUCCESS :(

Toutes les suggestions? Thx, Milan

Répondre

1

Êtes-vous vérifier les valeurs de retour de ldap_init(), ldap_set_option(), et ldap_connect()?

Je voudrais essayer d'utiliser un SEC_WINNT_AUTH_IDENTITY_EX la structure et le remplissage dans la version et la longueur.

Sinon, votre code semble bon pour moi.

Il pourrait également retomber à l'accès anonyme ou l'accès comme utilisateur connecté.

Windows peut être assez "utile" pour faire correspondre les chaînes de domaine et les noms d'utilisateur. Que faites-vous passer pour le domaine? Est-ce une chaîne de domaine plausible, mais inexistante? S'il enfreint les règles de dénomination, il peut être ignoré et l'utilisateur doit correspondre comme si vous n'aviez pas spécifié de nom d'utilisateur. En particulier, les noms d'utilisateur connus tels que "Administrateur" finissent par correspondre à peu près à n'importe quel ordinateur ou domaine local.

Avez-vous essayé d'effectuer une requête simple avec la connexion liée?

Il y a un cas étrange où une liaison réussira en utilisant un mot de passe récemment expiré, mais provoquera une opération pour qu'une liaison ultérieure sur la même connexion échoue arbitrairement. Je ne pense pas que ce soit ce que vous voyez cependant. Si vous rencontrez ce cas bizarre, je pense que la solution est enterrée quelque part: http://support.microsoft.com/default.aspx?scid=kb;EN-US;823659

+0

Bonjour, je vais essayer la version 'EX' de la structure. À propos des valeurs de retour, assurez-vous que je les vérifie. Ce n'est qu'un court test. Quoi qu'il en soit thx, rezna – rezna

1

La liaison est réussie car le couple nom d'utilisateur/mot de passe est valide pour le domaine auquel vous êtes connecté pendant l'appel ldap_init. Dans ce cas, le domaine fourni dans les informations d'identification est simplement ignoré.

Pour confirmer cette affirmation, vous pouvez essayer d'utiliser des informations d'identification provenant d'un domaine approuvé de ce serveur. Étant donné que l'utilisateur n'existe pas dans le domaine auquel vous êtes connecté, la fourniture d'un nom de domaine non valide entraînera un échec de liaison avec INVALID_CREDENTIALS.

Espérons que cela aide.

Questions connexes