безопасность — аутентифицировать пользователя через программу на C ++ с помощью ldap или pam

Моя программа должна аутентифицировать людей, текущая машина, на которой она работает, идентифицирует пользователей через ldap-сервер.

Я успешно проверил этот код на простом компьютере:

#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <security/pam_appl.h>
#include <unistd.h>

// To build this:
// g++ pam.cc -lpam -o test

struct pam_response *reply;

//function used to get user input
int function_conversation(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr)
{
*resp = reply;
return PAM_SUCCESS;
}

int main(int argc, char** argv)
{
if(argc != 2) {
fprintf(stderr, "Usage: check_user <username>\n");
exit(1);
}
const char *username;
username = argv[1];

const struct pam_conv local_conversation = { function_conversation, NULL };
pam_handle_t *local_auth_handle = NULL; // this gets set by pam_start

int retval;

// local_auth_handle gets set based on the service
retval = pam_start("common-auth", username, &local_conversation, &local_auth_handle);

if (retval != PAM_SUCCESS)
{
std::cout << "pam_start returned " << retval << std::endl;
exit(retval);
}

reply = (struct pam_response *)malloc(sizeof(struct pam_response));

// *** Get the password by any method, or maybe it was passed into this function.
reply[0].resp = getpass("Password: ");
reply[0].resp_retcode = 0;

retval = pam_authenticate(local_auth_handle, 0);

if (retval != PAM_SUCCESS)
{
if (retval == PAM_AUTH_ERR)
{
std::cout << "Authentication failure." << std::endl;
}
else
{
std::cout << "pam_authenticate returned " << retval << std::endl;
}
exit(retval);
}

std::cout << "Authenticated." << std::endl;

retval = pam_end(local_auth_handle, retval);

if (retval != PAM_SUCCESS)
{
std::cout << "pam_end returned " << retval << std::endl;
exit(retval);
}

return retval;
}

Но это не сработает на ldap. Он просто скажет «Ошибка аутентификации». Поэтому я попытался подумать, что проблема в ldap:

#include <stdio.h>
#include <ldap.h>
/* LDAP Server settings */
#define LDAP_SERVER "ldap://annuaire.upmc.fr:389"
int
main( int argc, char **argv )
{
LDAP        *ld;
int        rc;
char        bind_dn[100];

/* Get username and password */
if( argc != 3 )
{
perror( "invalid args, required: username password" );
return( 1 );
}
sprintf( bind_dn, "uid=%s,ou=people,dc=upmc,dc=fr", argv[1] );
printf( "Connecting as %s...\n", bind_dn );

/* Open LDAP Connection */
if( ldap_initialize( &ld, LDAP_SERVER ) )
{
perror( "ldap_initialize" );
return( 1 );
}/* User authentication (bind) */
rc = ldap_simple_bind_s( ld, bind_dn, argv[2] );
if( rc != LDAP_SUCCESS )
{
fprintf(stderr, "ldap_simple_bind_s: %s\n", ldap_err2string(rc) );
return( 1 );
}
printf( "Successful authentication\n" );
ldap_unbind( ld );
return( 0 );
}

Однако я получил эту ошибку при попытке войти в систему:

ldap_simple_bind_s: Invalid credentials.

Похоже, сервер найден, но не может аутентифицировать меня.

Мои вопросы: в чем разница между pam и ldap, является ли pam более общим способом аутентификации? Могу ли я добиться аутентификации для ldap с помощью программы pam или, если нет, что не так с моим кодом тестирования ldap?

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]