ユーザーがLDAPサーバー経由で認証されるクライアントアプリ(OpenLDAPライブラリを使用)を書いています。
これは、ユーザーの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サーバーで平文であれば機能します。MD5で暗号化されている場合は同じパスワードで、ldap_compare_sは失敗します。これは、比較するクリアテキストのパスワードを渡しているためです。
このサンプルプログラムを機能させるにはどうすればよいですか?
私はこれを正しく行っていますか?ldap_compare_s
LDAP経由でユーザーを認証するために使用することは正しいですか?
PS:私がLDAPに取り組んでいるのはこれが初めてです。
これは、LDAPでパスワードチェックを実行するための実際の正しい方法ではありませんdn
。最初の検索から取得したパスワードと指定されたパスワードを使用してバインドを試みることです。
つまり、2番目のバインドを実行してパスワードを検証します。バインドが失敗した場合、パスワードは正しくありません。
次のようなもの:
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 );
}
セキュリティ上の理由から、ユーザー名が正しくないこと(つまり、ユーザーアカウントの検索が失敗したこと)は、一般に過度の開示と見なされ、回避する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加