C++ библиотеки для работы с Active Directory

Автор ioann.sys, 03 июля 2015, 14:54:58

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

ioann.sys

Приветствую!
Подскажите пожалуйста, есть-ли какие-нибудь API в debian для работы с Active Directory?

Пишу небольшое приложение, для своих рабочих. Хочется реализовать доменную авторизацию. Например, запускаете приложение, у вас запрашивают логин и пароль. В качестве идентификационных данных используются данные из AD. После чего, проверяется принадлежность доменных групп безопасности пользователя. Если пользователь состоит в группе Domain Administrators - то для такого пользователя будет генерироваться соответствующий интерфейс программы (дополнительные чекбоксы/кнопочки и т. п.).

p.s.: Знаю, что такие библиотеки есть у Питона. Например в системе OTRS (http://www.otrs.com/software/?lang=ru) можно организовать доменную авторизацию. Там подключаются библиотеки LDAP для такой схемы авторизации. Предварительно, создав пользователя в домене.

p.s.2: Предполагаю, что задачу помогут решить пакеты libldap2-dev и libldab-2.4-2. Кто-нибудь из опытных, может показать примитивный пример?
Debian GNU/Linux jessie/sid on notebook ASUS N750JK

Utility

Стационар = MB: ASRock N68-gs4 FX R2.0 ; CPU: Athlon II x3 460 => Phenom B60; RAM: 2x Kingston KVR1333D3N9/4G; VGA: zotac gt630 4G
Ноутбук = ASUS x55a = MB: chipset HM70; CPU: Celeron B820; RAM: 2G: VGA: intel3000; audio VT1802

ioann.sys

Цитата: Utility от 03 июля 2015, 20:46:14
http://www.openldap.org/ ?
Да, это то, что надо. "Курю" мануалы, на английском правда. Идёт тяжело.

Debian GNU/Linux jessie/sid on notebook ASUS N750JK

ioann.sys

К сожалению, не осилятор. Пришел к выводу, что мне поможет sync_bind, а не обычный ldap_init.
А еще, в инете я так и не нашел актуальной инфы, ибо вся, что есть - просрочена. Например, везде в примерах используется функция ldap_init, но в текущей версии, такая функция считается DEPRICATED и предлагают использовать ldap_initialize. Короче, много чего нового. Может, всё-таки на нашем форуме найдутся гуру, которые кодили с этой библиотекой?
Debian GNU/Linux jessie/sid on notebook ASUS N750JK

ioann.sys

#4
Всё-таки, шёл в правильном направлении. Пришлось учить матан по SASL.


#include <iostream>
#include <ldap.h>
#include <sasl/sasl.h>

using namespace std;
struct sasl_defaults
{
string username;
string password;
};

// обработка передачи кред
int do_interact(LDAP *ds, unsigned flags, void *indefaults, void *in)
{
sasl_defaults *defaults = static_cast<sasl_defaults *>(indefaults);
sasl_interact_t *interact = (sasl_interact_t *)in;
if (ds == NULL)
{
return LDAP_PARAM_ERROR;
}

while(interact->id != SASL_CB_LIST_END)
{
const char *dflt = static_cast<const char *>(interact->defresult);
switch(interact->id)
{
case SASL_CB_GETREALM:
dflt = NULL;
break;
case SASL_CB_USER:
case SASL_CB_AUTHNAME:
dflt = defaults->username.c_str();
break;
case SASL_CB_PASS:
dflt = defaults->password.c_str();
break;
}
interact->result = (dflt && *dflt) ? dflt : static_cast<const char *>("");
interact->len = strlen(static_cast<const char *>(interact->result));
interact++;
}
return LDAP_SUCCESS;
}
int main(int argc, char *argv[])
{
LDAP *ld;
int rc, version = 3;
rc = ldap_initialize(&ld, "ldap://192.168.1.1");  // сервер АД
cout << "ldap_init = " << rc << endl;
if(rc != LDAP_SUCCESS)
return 1;
if( (rc = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version)) != LDAP_OPT_SUCCESS)
return 2;
cout << "ldap_set_option protocol 3" << endl;
if( (rc = ldap_set_option(ld, LDAP_OPT_REFERRALS, LDAP_OPT_OFF)) != LDAP_OPT_SUCCESS)
return 3;
cout << "ldap_set_option refferals off" << endl;
// Креды
sasl_defaults def;
def.username = "ИМЯ ПОЛЬЗОВАТЕЛЯ БЕЗ ДОМЕННОЙ ЧАСТИ";
def.password = "ПАРОЛЬ";
ldap_set_option(ld, LDAP_OPT_CONNECT_ASYNC, LDAP_OPT_OFF);
ldap_set_option(ld, LDAP_OPT_SASL_METHOD, (void*)"DIGEST-MD5");

rc = ldap_sasl_interactive_bind_s(ld, NULL, "DIGEST-MD5", NULL, NULL, LDAP_SASL_AUTOMATIC, do_interact, &def);
cout << "BIND RESUT = " << rc << endl;
cout << "error = " << ldap_err2string(rc) << endl;
return ldap_unbind_ext(ld, NULL, NULL);
}


Вдруг кому-пригодится



А вот человек, по имени Олег реализовал мою идею: простая, удобная и грамотная обвёртка в класс LDAP_API. Причём, постарался реализовать для OpenLDAP && SunLDAP. Большое ему спасибо!
Debian GNU/Linux jessie/sid on notebook ASUS N750JK