Frage

Ich möchte Ihnen eine Frage zur Implementierung der gegenseitigen Authentifizierung mit Kerberos unter Verwendung von SSPI- und LDAP -API stellen.

Ich verwende die in: beschriebenen Richtlinien: LDAP_SASL_BIND_S (GSSAPI) - Was sollte in der Berechtigungsnachweise bereitgestellt werden.

Hier ist der Algorithmus, den ich verwende:


//--------------------------------------------------------------------------------------------
// client side

AcquireCredentialsHandle(NULL, "Kerberos", SECPKG_CRED_BOTH, NULL, &secIdent, NULL, NULL, &kClientCredential, &kClientTimeOut); 
// AcquireCredentialsHandle returns SEC_E_OK

// begin validation

unsigned long ulClientFlags = ISC_REQ_CONNECTION | ISC_REQ_MUTUAL_AUTH | ISC_REQ_DELEGATE;

int iCliStatus = InitializeSecurityContext(&kClientCredential, isContextNull(kClientContext) ? NULL : &kClientContext, 
                             pacTargetName, ulClientFlags, 0, SECURITY_NATIVE_DREP, pkServerToken, 
                             0, &kClientContext, &kClientToken, &ulContextAttr, NULL);

// InitializeSecurityContext returns SEC_I_CONTINUE_NEEDED

//--------------------------------------------------------------------------------------------
// server side

// ldap_init returns ok

ldap_set_option(ld, LDAP_OPT_SIGN, LDAP_OPT_OFF);
ldap_set_option(ld, LDAP_OPT_ENCRYPT, LDAP_OPT_OFF);

unsigned long ulVersion = LDAP_VERSION3;
ldap_set_option(ld, LDAP_OPT_VERSION, &ulVersion);

// ldap_connect returns LDAP_SUCCESS

// build the credentials based on what InitializeSecurityContext returned
BERVAL creds;
creds.bv_len = kClientToken.pBuffers[0].cbBuffer;
creds.bv_val = reinterpret_cast(kClientToken.pBuffers[0].pvBuffer);

BERVAL* pServerCreds = NULL;
int iError = ldap_sasl_bind_s(ld, "", "GSSAPI", &creds, NULL, NULL, &pServerCreds);

// ldap_sasl_bind_s returns LDAP_SUCCESS

unsigned long ulError = 0;
ldap_get_option(ld, LDAP_OPT_ERROR_NUMBER, &ulError);

// ulError is equal to LDAP_SASL_BIND_IN_PROGRESS

Und hier ist das Problem: Beide LDAP -Fehlercodes sind in Ordnung, aber pservercreds weist auf eine leere Berg -Struktur hin (nicht null, aber bv_len entspricht 0) und sollte den Server -Anmeldeinformator enthalten, den ich an den nächsten InitializeSecurityContext -Anruf übergeben muss. Wenn ich diese Daten verwende, um die SecBufferDesc -Struktur für den folgenden Anruf zu erstellen, kehrt sie zurück.

Soll LDAP_SASL_BIND_S ein leeres Berval zurückgeben oder etwas falsch mache?

Ich habe die Authentifizierung mit vollständigen SSPI -Aufrufen getestet (AcceptSecurityContext für den Server) und es funktioniert genauso wie erwartet. Das Problem ist, dass der Server plattformübergreifend sein muss, sodass ich SSPI nicht verwenden kann.

Danke, dass du dir die Zeit genommen hast, um zu antworten! Juan

War es hilfreich?

Lösung

Ich fand das Problem.

Entsprechend Dieser Thread Es gibt einen Fehler mit ldap_sasl_bind_s Rückgabe leerer Serveranmeldeinformationen in Windows XP. Ich habe meine Anwendung unter Windows 2008 Server getestet und die Anmeldeinformationen werden ordnungsgemäß zurückgegeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top