DirectoryEntry дает исключение com при попытке подключения к серверу ldap через безопасный порт

Снимок исключения введите описание изображения здесь ШАГ A => < strong> Проверка правильности конфигурации сертификата

У меня есть оконная служба, через которую я пытаюсь подключить сервер LDAP через безопасный порт 636 (SSL), все сертификаты настроены правильно, и я проверил это с помощью инструмента ldap.exe, а также проверяю инструмент portqry, чтобы проверить, есть ли порт 636 прослушивает или нет, и удалось это сделать.

ШАГ B => Фрагмент кода, который не работает для защищенного порта 636 (для SSL), но правильно работает с незащищенным портом (389). Странное наблюдение: приведенный ниже код работает хорошо, когда я запускаю его как консольное приложение даже с портом. 636, но не работает при запуске как оконная служба.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;
using System.DirectoryServices.Protocols;
using System.IO;
using System.Linq;
using System.Net;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace SampleLDAPWindowsService
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {

            TestDirectoryEntryWay();

        }

        protected override void OnStop()
        {


        }

        }
        public DirectoryEntry createDirectoryEntry()
        {
            // create and return new LDAP connection with desired settings  
            DirectoryEntry ldapConnection = null;
            ldapConnection = new DirectoryEntry("LDAP://abc.domain.com:636", "DomainAdmin", "DomainAdmin123", AuthenticationTypes.SecureSocketsLayer);
            return ldapConnection;
        }

        public void TestDirectoryEntryWay()
        {
            DirectorySearcher _searcher = null;
            SearchResult result_user = null;
            DirectoryEntry de = createDirectoryEntry();
            try
            {
                object o = de.SchemaEntry;//Getting a com exception  as the SchemaEntry is null not sure why as the same is working properly in port 389 
                _searcher = new DirectorySearcher(de, "(&(objectClass=user)(SAMAccountName=" + "demouser1" + "))");
                if (_searcher != null)
                {
                    result_user = _searcher.FindOne();

                }
            }
            catch (Exception ex)
            {
                //Getting a com exception 

            }

        }
    }
}

ШАГ C => Код, который работает как в порте 636, так и в порте 389 в оконной службе

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;
using System.DirectoryServices.Protocols;
using System.IO;
using System.Linq;
using System.Net;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace SampleLDAPWindowsService
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            System.Diagnostics.Debugger.Launch();
            // TestDirectoryEntryWay();
            var isLogged2 = SignInLDAP2("DomainAdmin", "DomainAdmin123", ""LDAP://abc.domain.com:636"", "abc.domain.com", true);
        }

        protected override void OnStop()
        {


        }

        public  bool SignInLDAP2(string user, string psw, string ldapPath, string domain = null, bool useSSL = false)
        {
            // LdapConnection ldapConnection = new LdapConnection(ldapPath);

            var ldapDirectoryIdentifier = new LdapDirectoryIdentifier("abc.domain.com", 636, true, false);
            LdapConnection ldapConnection = new LdapConnection(ldapDirectoryIdentifier);

            if (useSSL)
            {
                ldapConnection.SessionOptions.SecureSocketLayer = true;

                ldapConnection.AuthType = AuthType.Negotiate;

                ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; };
            }

            //var networkCredential = new NetworkCredential("Hey", "There", "Guy");
            var networkCredential = new NetworkCredential(user, psw, domain);
            try
            {
                ldapConnection.Bind(networkCredential);

                bool exists = UserExists("demouser1");
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        public bool UserExists(string username)
        {
            // create your domain context
            using (PrincipalContext domain = new PrincipalContext(ContextType.Domain, "abc.domain.com", "DomainAdmin", "DomainAdmin123"))
            {
                // find the user
                UserPrincipal foundUser = UserPrincipal.FindByIdentity(domain, IdentityType.Name, username);

                return foundUser != null;
            }
        }



        }
    }
}

ВОПРОС:

Есть ли проблема при работе с безопасным портом с DirectoryEntry, поскольку LdapConnection и networkCredential без проблем работают с обоими портами (636 и 389), у меня есть устаревший код, который использует DirectoryEntry, и я хочу, чтобы он работал для безопасного порта, может кто-нибудь, пожалуйста, помогите мне, как заставить ШАГ B работать и для безопасного порта.

Заранее благодарим за поддержку и руководство.


person Aashish Mukherjee    schedule 16.08.2018    source источник


Ответы (1)


Вероятно, что сертификат SSL не доверяет компьютер, на котором вы его используете.

Я использую Chrome, чтобы проверить это. Запустите Chrome следующим образом (отрегулируйте путь, по которому находится ваш Chrome):

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --explicitly-allowed-ports=636

Затем в Chrome перейдите по адресу https://abc.domain.com:636. Если сертификат является доверенным, вы увидите сообщение типа «не удается подключиться». Но если ему не доверяют, Chrome выдаст большое красное предупреждение, и вы знаете, что проблема.

Чтобы доверять сертификату, вам необходимо получить корневой сертификат (в виде файла, вероятно, * .cer или * .crt) и установить его на каждом компьютере, на котором будет выполняться ваш код. Вот инструкции по установке корневого сертификата в Windows: https://www.thewindowsclub.com/manage-trusted-root-certificates-windows

person Gabriel Luci    schedule 17.10.2018