如何为使用LDAP的用户进行密码validation?

我正在编写一个客户端应用程序(使用OpenLDAP库),用户通过LDAP服务器进行身份validation。

下面是示例,硬编码,无法比较userPassword为用户的程序。

#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(如果它在LDAP服务器中是纯的),它工作。 如果它是MD5encryption的相同的密码, ldap_compare_s失败。 这是因为我正在传递明文密码进行比较。

我如何得到这个示例程序的工作?

我做对了吗? 使用ldap_compare_s通过LDAPvalidation用户是否正确?

PS:这是我第一次使用LDAP。

Solutions Collecting From Web of "如何为使用LDAP的用户进行密码validation?"

这不是在LDAP上执行密码检查的正确方法,你应该做的就是尝试使用从第一次搜索获得的dn和提供的密码进行绑定。

即您执行第二个绑定来验证密码。 如果绑定失败,则密码不正确。

类似于:

  if ( (dn = ldap_get_dn( ld, e )) != NULL ) { printf( "dn: %s\n", dn ); /* rebind */ ldap_initialize(&ld2, LDAP_SERVER); rc = ldap_simple_bind_s(ld2, dn, "secret"); printf("%d\n", rc); if (rc != 0) { printf("Failed.\n"); } else { printf("Works.\n"); ldap_unbind(ld2); } ldap_memfree( dn ); } 

出于安全原因,表明用户名不正确(即搜索用户帐户失败)通常被认为是过度公开,应该避免。