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.
2 odpowiedzi
Jeśli chcesz tylko szyfrować i nie potrzebujesz silnego uwierzytelniania serwera ldap, może powinieneś dodać:
connection.SessionOptions.VerifyServerCertificate =
new VerifyServerCertificateCallback((con, cer) => true);
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ć.
Podobne pytania
Powiązane pytania
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.