私は、LDAPサーバー経由でユーザーが認証されるクライアントアプリケーション(OpenLDAPライブラリを使用)を作成しています。LDAPを使用するユーザのパスワード認証を行う方法は?
ここでは、ユーザーの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経由でユーザーを認証するのは正しいですか?
P .: LDAPで作業しているのは初めてです。
あなたの答えをありがとう。 2度目のバインディングは完璧です。まったく異なる状況では、別の質問があります。クライアントの設計についてもっと学ぶための情報源はありますか?私は "暗号化"と "紹介"のための機能を持っていたい。ありがとう –
暗号化のサポートは、接続にldapsを使用して行います。照会を追跡するために、 'LDAP_OPT_DEREF'を使用するモードに設定します。クライアントの設計...残念ながら、答えるには大きすぎる質問です。適切な唯一の答えは「それは依存する」です。 – Petesh
多くの情報に感謝します!大変感謝しています。 :) –