Problemi di autenticazione utente con il provider WinNT active directory Service Interfaces

Questo articolo descrive i problemi di autenticazione utente con il provider WinNT Active Directory Service Interfaces (ADSI).

Si applica a: Windows 10 - tutte le edizioni
Numero KB originale: 218497

Riepilogo

Il metodo ADSI OpenDsObject o la funzione helper C ADsOpenDsObject consente di fornire le credenziali di autenticazione al server di directory quando si apre un oggetto. Quando si usa questa tecnica con il provider WinNT Active Directory Service Interfaces, è necessario tenere presente una serie di problemi.

Ulteriori informazioni

Il provider WinNT interfacce del servizio Active Directory usa la funzione WNetAddConnection2 per stabilire una connessione a \\nomeserver\IPC$ per stabilire queste credenziali con il server remoto. Questo metodo è utile perché non richiede privilegi speciali per i client NT e funziona in Windows e supporta l'autenticazione tra domini non attendibili.

Sfortunatamente, la funzione WNetAddConnection2 presenta diversi svantaggi e sono i seguenti:

  • Se è già stata stabilita una connessione al server di destinazione da qualsiasi processo in esecuzione nel computer client, la funzione WNetAddConnection2 non può stabilire una nuova connessione con credenziali diverse da quelle usate per la connessione esistente.

    Se si tenta di autenticare un nuovo account, si otterrà un errore di credenziali in conflitto. Se si tenta di autenticare l'account esistente, qualsiasi password funzionerà (valida o meno). Si tratta di un problema particolare quando si ricevono oggetti da un controller di dominio in cui molti processi di sistema stabiliscono connessioni ai controller di dominio.

  • Se l'account Guest è abilitato nel computer di destinazione, è possibile passare un nome utente e una password non validi e creare una connessione.

  • Il sistema non fa riferimento al conteggio delle connessioni, pertanto, se un processo, incluso il processo client di Active Directory Service Interfaces, elimina la connessione, tutti i processi che usano tale connessione devono essere scritti per ristabilire la connessione quando trovano che è stata eliminata.

Quando si usa il provider WinNT, è consigliabile eseguire l'autenticazione con il server di destinazione accedendo a un account di dominio con le credenziali appropriate o usando la funzione LogonUser (che richiede privilegi elevati) prima di eseguire il codice di Active Directory Service Interfaces. È anche consigliabile non utilizzare il metodo OpenDsObject delle interfacce del servizio Active Directory per convalidare le credenziali di un utente in qualsiasi dominio considerato attendibile dal computer client.

Se si sta tentando di convalidare gli account da domini non attendibili, usare il metodo OpenDsObject di Active Directory Service Interfaces, tenendo presenti i problemi elencati in precedenza e comprendendo che si invieranno password non crittografate in rete. È possibile superare queste restrizioni eseguendo il codice di convalida come servizio in almeno un server in ogni set di domini non attendibili usando una connessione SSL (o HTTPS) per fornire la crittografia. A tale scopo, usare un file di .asp di convalida in un server IIS in ogni set di domini non attendibili e connettersi ad esso tramite HTTPS usando l'autenticazione di base.

Il metodo OpenDsObject delle interfacce del servizio Active Directory usa le credenziali dell'utente connesso per accedere a IIS. Il nome utente e la password specificati come parametri vengono ignorati. Viene visualizzato il messaggio di errore seguente:

Accesso negato

Tuttavia, funziona dopo l'aggiunta dell'utente connesso del client al gruppo Administrators del server.

Funziona anche se si usa il codice script seguente.

Set objLogon = CreateObject("LoginAdmin.ImpersonateUser")  
objLogon.Logon "Administrator", "AdminPassword", "Machinename"  
Set oNS = GetObject("IIS:")
Set oRoot = oNS.OpenDSObject("IIS://SERVER/SHARE", "Mordor\administrator", "Gollum", 1)'User credentials are ignored  
objLogon.Logoff
Set objLogon = Nothing