Pracuję nad serwisem służącym do resetowania haseł użytkowników LDAP. Nie jestem w stanie nawiązać połączenia z serwerem przez ssl. Próbowałem różnych typów kodu i uwierzytelniania.

To jest to, co jest używane na serwerze do połączenia z LDAP, na którym hostowana jest witryna. Testowałem go również z obydwoma portami ssl. 636 i 3269.

0 = ldap_set_option(ld, LDAP_OPT_ENCRYPT, 1)
res = ldap_bind_s(ld, NULL, &NtAuthIdentity?, NEGOTIATE (1158)); v.3

{NtAuthIdentity?: User='_ldapuser'; Pwd='unavailable';; domain = 'SJTPNOC.DOMAIN'}

Używam następującego kodu na stronie

LdapConnection connection = new LdapConnection(new LdapDirectoryIdentifier("SJTP.DOMAIN",636));

connection.SessionOptions.ProtocolVersion = 3;

connection.AuthType = AuthType.Basic;

connection.Credential = new NetworkCredential("CN=user,CN=Users,DC=SJTPNOC,DC=DOMAIN", "password","CN=Users,DC=SJTPNOC,DC=DOMAIN");

connection.SessionOptions.SecureSocketLayer=true;

connection.Bind();

Pobieranie wyjątku „Serwer LDAP jest niedostępny”. Próbowałem tego kodu z portem 389 i bez ssl i działa dobrze.

Daj mi znać, co jest nie tak.

4
mayank.karki 27 wrzesień 2012, 16:20

2 odpowiedzi

Najlepsza odpowiedź

Jeśli chcesz tylko szyfrować i nie potrzebujesz silnego uwierzytelniania serwera ldap, może powinieneś dodać:

connection.SessionOptions.VerifyServerCertificate =
                new VerifyServerCertificateCallback((con, cer) => true);
4
jbl 27 wrzesień 2012, 16:57

Miałem też problem z połączeniem przez SSL, ale nie przez zwykły tekst. Zrobiłem trochę podsłuchiwania sieci i mogłem zobaczyć, że chociaż ustawiłem LdapConnection.AuthType na Basic, mój komputer kliencki znajdował i używał certyfikatów klienta do uzgadniania SSL. Certyfikat, który znalazł (nie wiem, czy powinienem być wściekły na VisualStudio, czy na klasę .NET LdapConnection) był tandetnym, samopodpisanym certyfikatem, który nie podobał się serwerowi LDAP. Zwrócił bardzo bezpieczny błąd „serwer niedostępny”; dobrze na to. Tak więc w SessionOptions jest delegat do rozpoznawania certyfikatów klienta, którego potrzebowałem, aby zapewnić bardzo prostą implementację:

public static X509Certificate ClientCertFinder(LdapConnection connection,
                                                byte[][] trustedCAs)
{
   return null;
}

Następnie ustaw delegata SessionOptions QueryClientCertificateCallback, aby używał kodu pośredniczącego w następujący sposób:

connection.SessionOptions.QueryClientCertificate =
      new QueryClientCertificateCallback(ClientCertFinder);

Prawdopodobnie mógłbyś nawet uczynić to jednym wierszem, jak w odpowiedzi @jbl na wywołanie zwrotne walidacji, ale być może pewnego dnia będę chciał przeprowadzić uwierzytelnianie-certyfikatu-klienta, a posiadanie tego skrótu służy jako przypomnienie, jak to zrobić.

3
Greg 30 lipiec 2013, 01:51