Страница 1 из 1

Авторизация на сайте с помощью Active Directory напрямую на C++

Добавлено: 29 май 2025, 05:14
ya
Авторизация на сайте с помощью Active Directory напрямую на C++

Необходимые пакеты к установке

Код: Выделить всё

sudo apt install libldap2-dev
Общая идея
Использовать LDAP для аутентификации пользователя в Active Directory.
Написать небольшую C++ программу, которая:
получает имя пользователя и пароль
пытается выполнить LDAP bind с этими данными
возвращает результат (успешно/неуспешно)

Пример кода на C++ с использованием LDAP
Для этого потребуется библиотека OpenLDAP. На Linux её можно установить через менеджер пакетов (например, libldap2-dev).

Код: Выделить всё

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

bool authenticate(const std::string& user, const std::string& pass, const std::string& ldap_server, const std::string& base_dn) {
    LDAP *ld;
    int result;

    result = ldap_initialize(&ld, ldap_server.c_str());
    if (result != LDAP_SUCCESS) {
        std::cerr << "ldap_initialize failed: " << ldap_err2string(result) << std::endl;
        return false;
    }

    // Установка версии LDAP
    int version = LDAP_VERSION3;
    ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version);

    // Формируем DN пользователя
    std::string user_dn = "CN=" + user + "," + base_dn; // или другой формат DN в вашей AD

    // Попытка привязки (bind) с учетными данными пользователя
    result = ldap_simple_bind_s(ld, user_dn.c_str(), pass.c_str());

    if (result != LDAP_SUCCESS) {
        std::cerr << "Bind failed: " << ldap_err2string(result) << std::endl;
        ldap_unbind_s(ld);
        return false;
    }

    // Успешная аутентификация
    ldap_unbind_s(ld);
    return true;
}

int main() {
    std::string username, password;
    std::cout << "Enter username: ";
    std::cin >> username;
    std::cout << "Enter password: ";
    std::cin >> password;

    std::string ldap_server = "ldap://yourdomain.com"; // адрес LDAP сервера
    std::string base_dn = "DC=yourdomain,DC=com";     // базовый DN

    if (authenticate(username, password, ldap_server, base_dn)) {
        std::cout << "Authentication successful!" << std::endl;
    } else {
        std::cout << "Authentication failed." << std::endl;
    }

    return 0;
}
Сборка программы

Код: Выделить всё

g++ -std=c++11 ldap_auth.cpp -o ldap_auth -lldap
Важные моменты
Вам нужно установить библиотеку libldap (apt install libldap2-dev).
Формат DN зависит от вашей Active Directory. Обычно это что-то вроде "CN=username,CN=Users,DC=domain,DC=com" или "UserPrincipalName=username@domain.com".
В реальных приложениях лучше использовать безопасное соединение (LDAPS) и защищать пароли.

Re: Авторизация на сайте с помощью Active Directory напрямую на C++

Добавлено: 29 май 2025, 05:41
ya

Код: Выделить всё

#include <iostream>
#include <string>
#include <ldap.h>

// Функция аутентификации через LDAP
bool authenticateUser(const std::string& username, const std::string& password,
                      const std::string& ldap_uri, const std::string& user_dn_format) {
    LDAP *ld;
    int rc;

    // Инициализация LDAP-соединения
    rc = ldap_initialize(&ld, ldap_uri.c_str());
    if (rc != LDAP_SUCCESS) {
        std::cerr << "Failed to initialize LDAP: " << ldap_err2string(rc) << std::endl;
        return false;
    }

    // Установка версии протокола LDAP
    int version = LDAP_VERSION3;
    ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version);

    // Формируем DN пользователя, например: "CN=User,DC=domain,DC=com"
    std::string user_dn = user_dn_format;
    size_t pos = user_dn.find("%s");
    if (pos != std::string::npos) {
        user_dn.replace(pos, 2, username);
    }

    // Попытка привязки (bind) с учетными данными пользователя
    rc = ldap_simple_bind_s(ld, user_dn.c_str(), password.c_str());
    if (rc != LDAP_SUCCESS) {
        std::cerr << "LDAP bind failed: " << ldap_err2string(rc) << std::endl;
        ldap_unbind_s(ld);
        return false;
    }

    // Успешная аутентификация
    ldap_unbind_s(ld);
    return true;
}

int main() {
    std::string username, password;

    std::cout << "Введите имя пользователя: ";
    std::cin >> username;
    std::cout << "Введите пароль: ";
    std::cin >> password;

    // Настройки LDAP
    std::string ldap_uri = "ldap://your-ldap-server"; // например, ldap://192.168.1.1
    std::string user_dn_format = "CN=%s,DC=yourdomain,DC=com"; // формат DN с %s для имени пользователя

    if (authenticateUser(username, password, ldap_uri, user_dn_format)) {
        std::cout << "Авторизация прошла успешно!" << std::endl;
    } else {
        std::cout << "Ошибка авторизации." << std::endl;
    }

    return 0;
}