Sto provando a utilizzare lo spazio dei nomi .NET 3.5 System.DirectoryServices.AccountManagement
per convalidare le credenziali dell'utente sul server LDAP di Active Directory su una connessione LDAP crittografata SSL. Ecco il codice di esempio:Come convalidare i credenziali di Active Directory su LDAP + SSL?
using (var pc = new PrincipalContext(ContextType.Domain, "sd.example.com:389", "DC=sd,DC=example,DC=com", ContextOptions.Negotiate))
{
return pc.ValidateCredentials(_username, _password);
}
Questo codice funziona bene su LDAP non protetto (porta 389), ma preferirei non trasmetto una combinazione utente/passaggio in chiaro. Ma quando cambio a LDAP + SSL (porta 636), ottengo la seguente eccezione:
System.DirectoryServices.Protocols.DirectoryOperationException: The server cannot handle directory requests.
at System.DirectoryServices.Protocols.ErrorChecking.CheckAndSetLdapError(Int32 error)
at System.DirectoryServices.Protocols.LdapSessionOptions.FastConcurrentBind()
at System.DirectoryServices.AccountManagement.CredentialValidator.BindLdap(NetworkCredential creds, ContextOptions contextOptions)
at System.DirectoryServices.AccountManagement.CredentialValidator.Validate(String userName, String password)
at System.DirectoryServices.AccountManagement.PrincipalContext.ValidateCredentials(String userName, String password)
at (my code)
Port 636 funziona per altre attività, come ad esempio la ricerca delle informazioni non-password per tale voce LDAP/AD ...
UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, _username)
... così io so che non è messa a punto del mio SSL server LDAP, poiché funziona su SSL per altre ricerche.
Qualcuno ha ottenuto la chiamata ValidateCredentials(...)
per funzionare su SSL? Puoi spiegare come? O c'è un altro/miglior modo per validare in modo sicuro le credenziali AD/LDAP?
Ecco un articolo di MSDN per la risoluzione dei problemi di LDAP su SSL: http://support.microsoft.com/kb/938703 – CAbbott
Grazie per il collegamento. Ma di nuovo posso comunicare su LDAPS (porta 636) bene per tutte le altre query LDAP che ho eseguito. Sembra qualcosa di insolito su 'ValidateCredentials()'. Vedrò comunque l'articolo in maggiore dettaglio. –
Le password devono essere trasmesse in chiaro - non con hash - su una connessione protetta a un server che supporta i controlli della qualità della password e della cronologia delle password a meno che il client LDAP non fornisca la verifica della password e della cronologia della password, altrimenti il server non sarà in grado di qualità e storia. –