Condividi tramite


Binding con ADsOpenObject e IADsOpenDSObject::OpenDSObject

La funzione ADsOpenObject e il metodo IADsOpenDSObject::OpenDSObject vengono usati per eseguire l'associazione agli oggetti del servizio directory quando è necessario specificare credenziali alternative e quando è necessaria la crittografia dei dati.

Le credenziali del thread chiamante devono essere usate quando possibile. Tuttavia, se è necessario usare credenziali alternative, è necessario utilizzare la funzione ADsOpenObject o il metodo IADsOpenDSObject::OpenDSObject . Se vengono usate credenziali alternative, è importante non memorizzare nella cache la password. È possibile eseguire più operazioni di associazione specificando il nome utente e la password per la prima operazione di associazione e quindi specificando solo il nome utente nelle associazioni successive. Il sistema configura una sessione alla prima chiamata e usa la stessa sessione nelle chiamate di associazione successive, purché vengano soddisfatte le condizioni seguenti:

  • Lo stesso nome utente in ogni operazione di associazione.
  • Implementare l'associazione serverless o l'associazione allo stesso server in ogni operazione di associazione.
  • Mantenere una sessione aperta tenendo premuto un riferimento a un oggetto da una delle operazioni di associazione. La sessione viene chiusa quando viene rilasciato l'ultimo riferimento all'oggetto.

ADsOpenObject e IADsOpenDSObject::OpenDSObject usano le interfacce SSPI (Security Support Provider Interface) di Windows NT per consentire flessibilità nelle opzioni di autenticazione. Il vantaggio principale dell'uso di queste interfacce consiste nel fornire diversi tipi di autenticazione ai client di Active Directory e crittografare la sessione. Attualmente, ADSI non consente il passaggio dei certificati. Pertanto, è possibile usare SSL per la crittografia e quindi Kerberos, NTLM o autenticazione semplice, a seconda della modalità di impostazione dei flag nel parametro dwReserved .

Non è possibile richiedere un provider SSPI specifico in ADSI, anche se si ottiene sempre il protocollo di preferenza più elevato. Nel caso di un'associazione client Windows a un computer che esegue Windows, il protocollo è Kerberos. Non consentire un certificato per l'autenticazione è accettabile nel caso di una pagina Web perché l'autenticazione si verifica prima di eseguire la pagina Web.

Anche se le operazioni Open consentono di specificare un utente e una password, non è consigliabile farlo. Non specificare invece credenziali e usare in modo implicito le credenziali del contesto di sicurezza del chiamante. Per eseguire l'associazione a un oggetto directory usando le credenziali del chiamante con ADsOpenObject o IADsOpenDSObject::OpenDSObject, specificare NULL sia il nome utente che la password.

Infine, per eseguire l'associazione senza autenticazione, usare il flag ADS_NO_AUTHENTICATION . Nessuna autenticazione indica che ADSI tenta di eseguire l'associazione come utente anonimo all'oggetto di destinazione e non esegue alcuna autenticazione. Equivale a richiedere l'associazione anonima in LDAP e indica che tutti gli utenti sono inclusi nel contesto di sicurezza.

Se i flag di autenticazione sono impostati su zero, ADSI esegue un'associazione semplice, inviata come testo non crittografato.

Attenzione

Se viene specificato un nome utente e una password senza specificare flag di autenticazione, il nome utente e la password vengono trasmessi in rete in testo non crittografato, ovvero un rischio per la sicurezza. Non specificare un nome utente e una password senza specificare i flag di autenticazione.

Esempi

Nell'esempio di codice di Visual Basic seguente viene illustrato come utilizzare il metodo IADsOpenDSObject::OpenDSObject .

Const ADS_SECURE_AUTHENTICATION = 1
Dim openDS As IADsOpenDSObject
Dim usr As IADsUser
 
Set openDS = GetObject("LDAP:")
 
openDS.OpenDSObject("LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
    vbNullString, 
    vbNullString,
    ADS_SECURE_AUTHENTICATION)

Nell'esempio di codice C++ seguente viene illustrato come usare la funzione ADsOpenObject .

IADs *pObject;
HRESULT hr;

hr = ADsOpenObject(L"LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
    NULL, 
    NULL,
    ADS_SECURE_AUTHENTICATION, 
    IID_IADs,
    (void**)&pObject);
if(SUCCEEDED(hr))
{
    // Use the object.

    // Release the object.
    pObject->Release()
}

L'interfaccia IADsOpenDSObject può essere usata anche in C++, ma duplica la funzione ADsOpenObject .

Nell'esempio di codice C++ seguente viene illustrato come usare l'interfaccia IADsOpenDSObject per eseguire la stessa operazione di associazione dell'esempio di codice precedente.

IADsOpenDSObject *pDSO;
HRESULT hr;
 
hr = ADsGetObject(L"LDAP:", IID_IADsOpenDSObject, (void**)&pDSO);
if(SUCCEEDED(hr))
{
    IDispatch *pDisp;

    hr = pDSO->OpenDSObject(CComBSTR("LDAP://CN=jeffsmith,DC=fabrikam,DC=com"),
        NULL,
        NULL,
        ADS_SECURE_AUTHENTICATION, 
        &pDisp);
    if(SUCCEEDED(hr))
    {
        IADs *pObject;

        hr = pDisp->QueryInterface(IID_IADs, (void**) &pObject);
        if(SUCCEEDED(hr))
        {
            // Use the object.

            // Release the object.
            pObject->Release();
        }

        pDisp->Release();
    }
    
    pDSO->Release();
}

Vedi anche

esempi di ADS_AUTHENTICATION_ENUM

IADsOpenDSObject

ADsOpenObject