Comment faire de l'authentification par mot de passe pour un utilisateur à l'aide de LDAP?
Je suis en train d'écrire une application cliente (à l'aide de OpenLDAP bibliothèques) pour lesquels les utilisateurs obtient authentifié par le serveur LDAP.
Voici l'échantillon, codé en dur, programme qui ne parvient pas à comparer userPassword pour un utilisateur.
#include <stdio.h>
#include <ldap.h>
#define LDAP_SERVER "ldap://192.168.1.95:389"
int main( int argc, char **argv ){
LDAP *ld;
int rc;
char bind_dn[100];
LDAPMessage *result, *e;
char *dn;
int has_value;
sprintf( bind_dn, "cn=%s,dc=ashwin,dc=com", "manager" );
printf( "Connecting as %s...\n", bind_dn );
if( ldap_initialize( &ld, LDAP_SERVER ) )
{
perror( "ldap_initialize" );
return( 1 );
}
rc = ldap_simple_bind_s( ld, bind_dn, "ashwin" );
if( rc != LDAP_SUCCESS )
{
fprintf(stderr, "ldap_simple_bind_s: %s\n", ldap_err2string(rc) );
return( 1 );
}
printf( "Successful authentication\n" );
rc = ldap_search_ext_s(ld, "dc=ashwin,dc=com", LDAP_SCOPE_SUBTREE, "sn=ashwin kumar", NULL, 0, NULL, NULL, NULL, 0, &result);
if ( rc != LDAP_SUCCESS ) {
fprintf(stderr, "ldap_search_ext_s: %s\n", ldap_err2string(rc));
}
for ( e = ldap_first_entry( ld, result ); e != NULL; e = ldap_next_entry( ld, e ) ) {
if ( (dn = ldap_get_dn( ld, e )) != NULL ) {
printf( "dn: %s\n", dn );
has_value = ldap_compare_s( ld, dn, "userPassword", "secret" );
switch ( has_value ) {
case LDAP_COMPARE_TRUE:
printf( "Works.\n");
break;
case LDAP_COMPARE_FALSE:
printf( "Failed.\n");
break;
default:
ldap_perror( ld, "ldap_compare_s" );
return( 1 );
}
ldap_memfree( dn );
}
}
ldap_msgfree( result );
ldap_unbind( ld );
return( 0 );
}
userPassword si c'est clair dans le serveur LDAP, il fonctionne.
le mot de passe même si c'est crypté MD5, ldap_compare_s échoue. Et c'est parce que je suis de passage le mot de passe en texte clair à comparer.
Comment puis-je obtenir cet exemple de programme de travail?
Je fais ce droit? Est-il correct d'utiliser ldap_compare_s
pour authentifier les utilisateurs via LDAP?
P. S: C'est la première fois que je suis en train de travailler sur le protocole LDAP.
OriginalL'auteur Ashwin kumar | 2013-04-23
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas vraiment la bonne façon d'effectuer un mot de passe vérifier sur LDAP, ce que vous devez faire est de tenter de lier l'aide de la
dn
obtenu à partir de la première recherche et le mot de passe fourni.c'est à dire d'effectuer un deuxième lier à vérifier le mot de passe. Si la liaison échoue, alors le mot de passe est incorrect.
Quelque chose qui ressemble à:
Pour des raisons de sécurité, indiquant que le nom d'utilisateur est incorrect (c'est à dire la recherche pour le compte de l'utilisateur échoue) est généralement considéré comme excessif de la divulgation, et doit être évitée.
Prise en charge du cryptage est accompli en utilisant le protocole ldaps pour les connexions. pour chasser les références, vous définissez la
LDAP_OPT_DEREF
à ce que le mode que vous souhaitez utiliser. La conception de clients... Qui, malheureusement, est beaucoup trop grand une question à la réponse. La seule réponse est "ça dépend" de.Merci beaucoup pour l'info! C'est grandement apprécié. 🙂
À l'aide de cette façon vous n'avez pas besoin de gérer tous les possibles (et impossibles) par mot de passe cryptage par vous-même, mais que le LDAP-server. C'est un grand plus!
OriginalL'auteur Petesh