Внедрение взаимной аутентификации с помощью LDAP API и SSPI

Я хотел бы задать вам вопрос о реализации взаимной аутентификации с помощью Kerberos, используя SSPI и LDAP API.

Я использую рекомендации, описанные в: ldap_sasl_bind_s(GSSAPI) — что должно быть указано в структуре учетных данных BERVAL.

Вот алгоритм, который я использую:


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

И вот проблема: оба кода ошибки LDAP в порядке, но pServerCreds указывает на пустую структуру BERVAL (не NULL, но bv_len равно 0), и она должна содержать учетные данные сервера, которые я должен передать следующему вызову InitializeSecurityContext. Если я использую эти данные для построения структуры SecBufferDesc для следующего вызова, она возвращает SEC_E_INVALID_TOKEN.

Должен ли ldap_sasl_bind_s возвращать пустой BERVAL или я делаю что-то не так?

Я протестировал аутентификацию с использованием полных вызовов SSPI (AcceptSecurityContext для сервера), и она работает так, как и ожидалось. Проблема в том, что мне нужен кроссплатформенный сервер, поэтому я не могу использовать SSPI.

Спасибо, что нашли время ответить! Хуан


person Juan Alvarez    schedule 26.01.2011    source источник


Ответы (1)


Я нашел проблему.

Согласно этой теме есть ошибка, когда ldap_sasl_bind_s возвращает пустые учетные данные сервера в Windows XP. Я протестировал свое приложение под Windows 2008 Server, и учетные данные были возвращены правильно.

person Juan Alvarez    schedule 31.01.2011