Buongiorno,
ho un problema cercando di implementare una ricerca su OpenLDAP. L'amministratore mi ha fornito un account con i diritti per farlo ma ho un problema di timeout, nel senso che dopo aver fatto con successo il bind con l'account per la ricerca, formulo una
richiesta di ricerca informazioni su un utente ma il server non mi risponde e la richiesta va in timeout (60 secondi).
Di seguito il codice, tralasciando impostazioni di sicurezza TLS che vedrei in un secondo momento.
// verifica autenticazione
public Utente Autentica(string username, string password)
{
Utente u = new Utente();
try
{
string hostName = "ip_openldap";
// login con utente autorizzato;
string hostNameAndSSLPort = hostName; // +":636";
string readerUsername = "utente_x_ricerche";
string readerPassword = "pwd_x_ricerche";
// establish a connection
LdapConnection connection = new LdapConnection(hostNameAndSSLPort);
// create an LdapSessionOptions object to configure session settings on the connection.
LdapSessionOptions options = connection.SessionOptions;
options.ProtocolVersion = 3;
options.SecureSocketLayer = false;
// bypassa verifica certificato: da risolvere
options.VerifyServerCertificate += (conn, cert) => { return true; };
//options.StartTransportLayerSecurity(new DirectoryControlCollection());
NetworkCredential credential = new NetworkCredential(readerUsername, readerPassword);
connection.Credential = credential;
connection.AuthType = AuthType.Basic;
// autentico il cercatore
connection.Bind();
//options.StopTransportLayerSecurity();
DNBase = "dc=dominio,dc=it";
string what = "uid=" + username;
string[] attributesToReturn = { "givenName", "cn", "mail" };
SearchRequest request = new SearchRequest(
DNBase,
"((" + what + "))",
System.DirectoryServices.Protocols.SearchScope.Subtree,
attributesToReturn
);
SearchResponse response = (SearchResponse)connection.SendRequest(request);
if (response.Entries.Count == 0)
{
throw new Exception("Utente non trovato.");
}
else if (response.Entries.Count > 1)
{
throw new Exception("Errore durante la lettura informazioni: corrispondenze multiple.");
}
else
{
options.StartTransportLayerSecurity(null);
// verifica credenziali
connection.Bind(new NetworkCredential(response.Entries[0].DistinguishedName, password));
options.StopTransportLayerSecurity();
// compilazione campi
SearchResultEntry entry = response.Entries[0];
u.NomeCompleto = (string)entry.Attributes["cn"][0];
u.Nome = (string)entry.Attributes["givenName"][0];
u.Mail = (string)entry.Attributes["mail"][0];
}
}
catch(Exception ex)
{
u.Errore = ex.Message;
}
return u;
}
Ho provato su 2 server versioni di openldap 2.4.39 e 2.4.23 stesso comportamento.
L'amministratore mi dice che dai log di ldap vede il bind del cercatore corretto, la ricezione della richiesta di ricerca e la risposta, ma il mio codice non
capta la risposta..
Grazie per l'aiuto