Не удается подключиться к LDAP с использованием SSL в консольном приложении Windows - PullRequest
0 голосов
/ 03 марта 2020

Я не могу подключиться к нашему LDAP-серверу Active Directory в windows консольном приложении. Я создал DLL, которая вызывает LDAP с использованием SSL. Когда он вызывается веб-приложением (работает на IIS) - он работает, но при запуске консольным приложением - происходит сбой. Откроется всплывающее окно «Windows Безопасность» (Смарт-карта, введите свой ПИН-код). Поскольку у меня нет смарт-карты, когда я нажимаю кнопку «Отмена», происходит сбой со следующей ошибкой:

Unhandled Exception: System.Runtime.InteropServices.COMException: The server is not operational.
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
   at System.DirectoryServices.DirectorySearcher.FindAll()

вот код:

Dim ADEntry As New DirectoryEntry(_ldapPath, _ldapLogin, _ldapPassword, AuthenticationTypes.SecureSocketsLayer)
Dim strSearch As New DirectorySearcher(ADEntry)

strSearch.Filter = "(samAccountName=" & login & ")"
strSearch.SearchScope = SearchScope.Subtree
strSearch.PropertiesToLoad.Add("samAccountName")
strSearch.PropertiesToLoad.Add("givenName")
strSearch.PropertiesToLoad.Add("displayName")
results = strSearch.FindAll

Этот код работает на IIS, но не как отдельное приложение. В последней строке происходит сбой.

Я также пытался использовать другой способ доступа к LDAP и пробовал следующий код:

Sub GetLdaps(mailbox As String)
    Dim con As LdapConnection = New LdapConnection(New LdapDirectoryIdentifier("xxx.yyy.zzz:636"))
    con.SessionOptions.SecureSocketLayer = True
    con.SessionOptions.VerifyServerCertificate = New VerifyServerCertificateCallback(AddressOf ServerCallBack)
    con.SessionOptions.QueryClientCertificate = New QueryClientCertificateCallback(AddressOf ClientCertificateCallback)
    con.SessionOptions.ProtocolVersion = 3
    con.Credential = New NetworkCredential("CN=username,OU=Excite,OU=Common Users,OU=Common Services,DC=net1,DC=xxx,DC=yyy,DC=zzz", "password")
    con.AuthType = AuthType.Basic
    con.Bind()

    Dim request As SearchRequest = New SearchRequest("DC=xxx,DC=yyy,DC=zzz", "((&(objectClass=user)(mail=" & mailbox & "))", SearchScope.Subtree)
    Dim response As SearchResponse = CType(con.SendRequest(request), SearchResponse)

    If response.Entries.Count = 1 Then
        Dim entry As SearchResultEntry = response.Entries(0)
        Dim DN As String = entry.DistinguishedName
    End If
End Sub

Public Function ClientCertificateCallback(connection As LdapConnection, trustedCAs As Byte()()) As X509Certificate
    Return Nothing
End Function

Public Function ServerCallBack(connection As LdapConnection, certificate As X509Certificate) As Boolean
    Return True
End Function

Я смог передать метод Bind() и пропустить Пин-код Всплывающее окно, добавив строку с con.SessionOptions.QueryClientCertificate, но теперь у меня возникает та же проблема, когда я делаю поисковый запрос.

Всплывающее окно с запросом пин-кода появляется, когда я набираю con.SendRequest(request), после нажатия «Отмена» поиск работает нормально. Я думаю, что проблема в том, что метод SendRequestBind) по умолчанию использует мое локальное хранилище сертификатов, и я не могу избежать этого. Для метода Bind я отключаю его, создавая функцию ClientCertificateCallback, но для SendRequest я не знаю, возможно ли это.

Я пытался выполнить это приложение с помощью Windows Task Scheduler (это будет будет запущен позже), если вы выберете опцию «Запускать, зарегистрирован ли пользователь» (без консоли: Environment.UserInteractive = false), всплывающее окно не появляется, и приложение работает. Так что я могу продолжить свою разработку, но во время разработки и отладки мне приходится каждый раз нажимать кнопку «Отмена» для каждого поиска.

Если кто-то знает, как избежать хранилища клиентских сертификатов Windows для LdapConnection.SendRequest метод, пожалуйста, поставьте ответ.

...