2016-06-17 7 views
1

Я пытаюсь подключиться к локальному LDAP-серверу, который настроил с помощью Apache Directory Studio. I'm с помощью студии 2015 обновления Визуального предприятий 2 и MVC 5.Как подключиться к локальному ldap-серверу с помощью MVC 5

Этих два подхода я работаю с:

public void ldap() 
    { 

     try 
     { 
      DirectoryEntry entry = new DirectoryEntry("LDAP://localhost:10389"); 
      DirectorySearcher mySearcher = new DirectorySearcher(entry); 

      var result = mySearcher.FindOne(); 

     } 
     catch (System.Runtime.InteropServices.COMException) 
     { 
      System.Runtime.InteropServices.COMException exception = new System.Runtime.InteropServices.COMException(); 
      Console.WriteLine(exception); 
     } 
     catch (InvalidOperationException) 
     { 
      InvalidOperationException InvOpEx = new InvalidOperationException(); 
      Console.WriteLine(InvOpEx.Message); 
     } 
     catch (NotSupportedException) 
     { 
      NotSupportedException NotSuppEx = new NotSupportedException(); 
      Console.WriteLine(NotSuppEx.Message); 
     } 
    } 

После вара результата = mySearcher.FindOne() выполняются, система .Runtime.InteropServices.COMException 'в System.DirectoryServices.dll, указывая, что при вызове COM-компонента была передана ошибка HRESULT E_FAIL.

Я понятия не имею, что это значит и не нашел что-то полезное с помощью Google.

второй подход:

try 
     { 
      LdapConnection ldapConnection = new LdapConnection("LDAP://localhost:10389"); 

      var networkCredential = new NetworkCredential("cbrunato", "c2VjcmV0", "dc=example,dc=com"); 
      ldapConnection.SessionOptions.SecureSocketLayer = true; 
      ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; }; 
      ldapConnection.AuthType = AuthType.Negotiate; 
      ldapConnection.Bind(networkCredential); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 

После ldapConnection.Bind (NetworkCredential) выполняется, я получаю сообщение об ошибке "сервер LDAP не доступен".

Когда я останавливаю сервер ldap и запускаю программу, я получаю те же ошибки, поэтому я думаю, что не получаю подключение к моему ldap-серверу с обоими подходами, но я не знаю, почему.

Я очень благодарен за любую помощь.

Update: Полномочия являются недействительными за исключением

Apache Directory Studio

Строки, используемые в качестве имени пользователя:

"uid=cbrunato" 
"cn=Chuck Brunato" 
"cn=Chuck Brunato,ou=Users,dc=example,dc=com" 
"uid=cbrunato,cn=Chuck Brunato,ou=Users,dc=example,dc=com" 
"uid=cbrunato,ou=Users,dc=example,dc=com" 
+0

E_FAIL, вероятно, является разрешение вопроса. Является ли идентификатор доступа к домену доступным? Я даже не помню, чтобы ADS разрешала интегрированную защиту, мне всегда приходилось предоставлять сетевые ресурсы. – rene

+0

Боюсь, я не понимаю. Я должен признать, что я совершенно новый для .NET. Вы говорите, что мое приложение не имеет разрешения на подключение к LDAP-серверу? –

+0

[Этот вопрос] (http://stackoverflow.com/questions/8700115/connecting-to-ldap-server-from-net) представляется полезным, поскольку он показывает, как предоставлять учетные данные, ответ важен, потому что вы используете ADS , Возможно, вам потребуется прочитать еще q + a на [topic] (http://stackoverflow.com/search?q=directorySearcher+networkcredential). – rene

ответ

0

У вас есть несколько проблем в использовании вашего LdapConnection.

Сначала вам нужно установить версию LdapProtocol, а во-вторых, вам потребуется базовая аутентификация. Опция Negotiate чаще всего работает только с продуктами Microsoft. Поскольку вы используете порт 10389, вам не нужен SSL, потому что 10636 является SSL-портом.

Этот код работает для меня:

try 
{ 
    // don't add LDAP://, the protocol is already known ... 
    LdapConnection ldapConnection = new LdapConnection("127.0.0.1:10389"); 
    // notice we don't use the domain here 
    var networkCredential = new NetworkCredential(
      "uid=yourusername,dc=example,dc=com", 
      "yourpassword"); 

    // Apache Directory Server uses LDAPv3 
    ldapConnection.SessionOptions.ProtocolVersion = 3; 

    // 10389 is the plain port, no ssl needed 
    //ldapConnection.SessionOptions.SecureSocketLayer = true; 
    // ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; }; 

    // let's not negotiate, only Basic is supported 
    ldapConnection.AuthType = AuthType.Basic; 
    ldapConnection.Bind(networkCredential); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.Message); 
} 
+0

Большое вам спасибо !!! Теперь я могу подключиться к серверу. Тем не менее, я получаю исключение после Bind(), что учетные данные недействительны. Я добавил фотографию своего Apache Directory Studio Server на вопрос. Я попробовал разные строки для имени пользователя (указан в вопросе). Может быть, проблема в том, что пароль SSHA hashed в ADS, но в NetworkCredentials пароль предоставляется как обычная строка? –

+0

Я могу подключиться к учетной записи администратора по умолчанию с помощью uid = admin, ou = system и пароля «secret», который сохраняется как обычный текст –

+0

Я бы ожидал этого 'uid = cbrunato, ou = Users, dc = example, dc = com 'работать. @DonKassube в моем тесте, пароль также был сохранен как SSHA, и мне не нужно ничего менять. – rene