2011-01-26 26 views
1

SSPIとLDAP APIを使用して、Kerberosとの相互認証を実装する方法について質問したいと思います。LDAP APIとSSPIとの相互認証の実装

私はldap_sasl_bind_s(GSSAPI) - What should be provided in the credentials BERVAL structureに記載されているガイドラインを使用しています。ここで

は、私が使用していたアルゴリズムです:


//-------------------------------------------------------------------------------------------- 
// 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エラーコードはOKですが、空のBERVAL構造にpServerCredsポイント(NULLではないが、bv_lenは0に等しいです)次のInitializeSecurityContext呼び出しに渡さなければならないサーバーの資格情報を含める必要があります。そのデータを使って、次の呼び出しのためにSecBufferDesc構造体を構築すると、SEC_E_INVALID_TOKENが返されます。

ldap_sasl_bind_sは空のBERVALを返しますか、何か間違っていますか?

私は完全なSSPI呼び出し(サーバーのAcceptSecurityContext)を使用して認証をテストしましたが、期待どおりに機能します。問題は、サーバーをクロスプラットフォームにする必要があるため、SSPIを使用できないということです。

お返事ありがとうございます! Juan

答えて

0

問題が見つかりました。

this threadによると、ldap_sasl_bind_sにWindows XPで空のサーバー資格情報が返されるというバグがあります。 Windows 2008 Serverでアプリケーションをテストし、資格情報が正しく返されました。

関連する問題