standard oxygen kepler for developers cdt c++ linux active-directory kerberos

c++ - kepler - eclipse oxygen download



Autenticación contra Active Directory con C++ en Linux (1)

sAMAccountName = MYDOMAIN / UserName, dc = mydomain, dc = local

Este formato de nombre de usuario es incorrecto. No necesita especificar sAMAccountName en su nombre de usuario y no necesita especificar dc menos que esté utilizando el Distinguished Name . Tienes pocas opciones para el nombre de usuario.

  1. Nombre distinguido

CN = Jeff Smith, OU = Ventas, DC = Fabrikam, DC = Com

  1. sAMaccountName

jsmith

  1. La ruta del usuario desde una versión anterior de Windows

"Fabrikam / jeffsmith".

  1. Nombre principal del usuario (UPN)

[email protected]

Habiendo dicho eso, no estoy seguro de si el nombre de usuario es el único problema que está experimentando. No he ejecutado tu código localmente.

Aunque esta respuesta puede no responder directamente a su pregunta, ya que no he probado este código en una máquina Linux, podría darle una idea o ponerlo en la dirección correcta. No me sorprendería si este método es solo específico de Windows.

Según MSDN, existen pocos methods que puede usar para autenticar a un usuario.

La función ADsOpenObject se une a un objeto ADSI utilizando credenciales de nombre de usuario y contraseña explícitas.

Este método acepta los siguientes parámetros:

HRESULT ADsOpenObject( _In_ LPCWSTR lpszPathName, _In_ LPCWSTR lpszUserName, _In_ LPCWSTR lpszPassword, _In_ DWORD dwReserved, _In_ REFIID riid, _Out_ VOID **ppObject );

Con este método, puede vincularse a un objeto en Active Directory especificando username y password .

Si el enlace tiene éxito, el código de retorno es S_OK , de lo contrario recibirá diferentes mensajes de error.

No escribo programas en C++ diariamente. Normalmente trabajo con Active Directory y Active Directory Lightweight Services en un mundo C# . Pero este código de muestra que escribí, le muestra cómo llamar ADsOpenObject método ADsOpenObject para enlazar a un objeto ADSI utilizando las credenciales especificadas. En tu caso, solo authenticate .

#include <iostream> #include "activeds.h" using namespace std; int main(int argc, char* argv[]) { HRESULT hr; IADsContainer *pCont; IDispatch *pDisp = NULL; IADs *pUser; CoInitialize(NULL); hr = ADsOpenObject( L"LDAP://yourserver", L"username", L"password", ADS_FAST_BIND, //authentication option IID_IADs, (void**) &pUser); if (SUCCEEDED(hr)) { cout << "Successfully authenticated"; } else cout << "Incorrect username or password"; return hr; }

Dependiendo de su configuración, es posible que ADS_AUTHENTICATION_ENUM modificar ADS_AUTHENTICATION_ENUM . Sugiero que instale el Certificado SSL y use el enlace ADS_USE_SSL . Tratar con contraseñas sin SSL en AD, puede ser una pesadilla.

Me sorprende que haya tan pocos ejemplos al respecto. Básicamente necesito hacer una autenticación de usuario / contraseña contra Active Directory. Puedo inicializar una conexión al directorio activo, pero siempre me da un error de "Credenciales no válidas". Me pregunto si estoy pasando algo mal. Este es mi primer intento con LDAP. Para el caso, estoy abierto a otra solución (bien documentada tal vez).

#include <iostream> #include <stdio.h> #define LDAP_SERVER "ldap://hq.mydomain.local/" #include <ldap.h> int main( int argc, char** argv ) { LDAP *ld; int version( LDAP_VERSION3 ); int rc; char bind_dn[100]; berval creds; berval* serverCreds; if( ldap_initialize( &ld, LDAP_SERVER ) ) { std::cerr << "Error initializing ldap..." << std::endl; return 1; } ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, &version ); creds.bv_val = "password"; creds.bv_len = strlen("password"); rc = ldap_sasl_bind_s( ld, "sAMAccountName=MYDOMAIN//UserName,dc=mydomain,dc=local", "GSSAPI", &creds, NULL, NULL, &serverCreds ); if ( rc != LDAP_SUCCESS ) { std::cerr << "ERROR: " << ldap_err2string( rc ) << std::endl; return 1; } else { std::cout << "Success." << std::endl; } return 0; }

EDITAR:

Quería asegurarme de que todo está bien en el lado del servidor, así que hice algunas pruebas con ldapsearch. No funcionó al principio, pero finalmente lo obtuve (con ldapsearch, de todos modos).

ldapsearch -D [email protected] -H "ldap://hq.mydomain.local:389" -b "ou=Development,ou=Domain Users,dc=mydomain,dc=local" -W "sAMAccountName=first.last"

Tal vez no sea la mejor manera. Para empezar, la clave es el argumento -D y pasa sAMAccountName al final. No voy a tener el nombre común, solo el nombre de inicio de sesión de Windows y su contraseña. El comando anterior le mostrará al usuario su información, si la contraseña pasa.

La advertencia (creo) es que ldap_sasl_bind_s () no tiene equivalente de establecer el indicador -D (binddn). Al ver esta pregunta / respuesta , parece que ldap_interactive_bind_s () podría, pero es un poco más complicado, ya que tengo que devolver la llamada.

Con el ejemplo anterior donde establezco una contraseña, pero no binddn / nombre de usuario de ningún tipo, ¿a quién asume que intento autenticarme como?