Question

Je voudrais vous poser une question sur la mise en œuvre d'authentification mutuelle avec Kerberos, en utilisant SSPI et API LDAP.

J'utilise les directives décrites dans: ldap_sasl_bind_s (GSSAPI) - Ce qui devrait être fournie dans les pouvoirs la structure BERVAL

.

Voici l'algorithme J'utilise:


//--------------------------------------------------------------------------------------------
// 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

Et voici le problème: les deux codes d'erreur LDAP sont ok, mais les points pServerCreds à une structure BERVAL vide (non NULL, mais égaux bv_len à 0), et il doit contenir le serveur de titres que je dois passer à la prochaine InitializeSecurityContext appel. Si j'utilise ces données pour construire la structure SecBufferDesc pour l'appel suivant, il retourne SEC_E_INVALID_TOKEN.

est-ldap_sasl_bind_s censé retourner un BERVAL vide ou que je fais quelque chose de mal?

J'ai testé l'authentification à l'aide d'appels SSPI complet (AcceptSecurityContext pour le serveur) et il fonctionne exactement comme prévu. Le problème est que j'ai besoin du serveur pour être multi-plateforme, donc je ne peux pas utiliser SSPI.

Merci d'avoir pris le temps de répondre! Juan

Était-ce utile?

La solution

Je trouve le problème.

Selon ce fil il y a un bug avec ldap_sasl_bind_s retour des informations d'identification de serveur vides dans Windows XP. Je l'ai testé mon application sous Windows 2008 Server et les informations d'identification sont retournés correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top