Компания Novell LDAP В С# - компании Novell.Справочник.Ldap-кто - нибудь сделал это работать?
Я пытаюсь использовать библиотеку, выпущенную Novell (новелл.Справочник.Протокол LDAP). Версия 2.1.10.
Что я сделал до сих пор:
я протестировал соединение с приложением (LdapBrowser) и это работает, так что это не проблема для общения.
Он скомпилирован в Mono, но я работаю с Visual Studio. Так создан проект с источниками. Я также включил ссылку на Mono.Безопасность, потому что от этого зависел проект.
Я прокомментировал вызов (freeWriteSemaphore (semId); ) в ошибке, поймав часть соединения, потому что он бросал больше исключений. Я проверил, что сделал этот вызов, и это просто механизм отслеживания ошибок.
-
Я выполнил основные шаги, приведенные в документации Novell (http://www.novell.com/coolsolutions/feature/11204.html).
// создание экземпляра LdapConnection
LdapConnection ldapConn= новый LdapConnection(); ldapConn.SecureSocketLayer = ldapPort == 636;
//Connect функция создаст подключение сокета к серверу
ldapConn.Connect (ldapHost,ldapPort);
//функция Bind свяжет учетные данные объекта пользователя с сервером
ldapConn.Bind (userDN,userPasswd);
прямо сейчас это сбой в функции Bind (). Я получаю ошибку 91.
Так, кто-нибудь когда-нибудь использовал эту библиотеку и видел, как это работает? Если да, то что вы сделали, чтобы заставить его работать, нужна ли какая-то специальная конфигурация? Есть ли способ заставить его работать в среде .NET без Mono (у меня могут быть ссылки на Mono DLL, но я не хочу, чтобы он был установлен на сервере)?
(обновление) Соединение находится на порту 636, таким образом, используя SSL. Я проверил с WireShark связь и сравнил с тем, что я получаю от браузера LDAP. Я видно, что шаг, на котором передается сертификат SSL, не выполняется библиотекой LDAP. Итак, каков наилучший способ заставить его делать то, что он должен?
(UPDATE) я проверил документацию, и это указывает на то, что она не поддерживает SSL. http://www.novell.com/coolsolutions/feature/11204.html
аутентификация на сервере LDAP с помощью LdapConnection.Связывать.)( Мы поддерживаем только аутентификация открытого текста. SSL / TLS поддержка будет добавлен.
но документация датируется 2004 годом, и с тех пор было сделано много обновлений. И есть параметр в библиотеке, чтобы определить, использует ли соединение SSL. Так что теперь я в замешательстве.
(UPDATE) нашел более актуальную документацию: http://developer.novell.com/documentation//ldapcsharp/index.html?page=/documentation//ldapcsharp/cnet/data/bqwa5p0.html - ... Способ подключения SSL осуществляется путем регистрации сертификата на сервер. Проблема в том, что то, что я делаю, не связано с определенным сервером Novell, поэтому сертификат должен быть получен динамически.
6 ответов
Я, наконец, нашел способ сделать эту работу.
во-первых, тезисы сообщений помогли мне встать на правильный путь:http://directoryprogramming.net/forums/thread/788.aspx
во-вторых, я получил скомпилированную dll библиотеки LDAP Novell и использовал Mono.Безопасность.файл DLL.
решение:
я добавил эту функцию в код
// This is the Callback handler - after "Binding" this is called
public bool MySSLHandler(Syscert.X509Certificate certificate, int[] certificateErrors)
{
X509Store store = null;
X509Stores stores = X509StoreManager.LocalMachine;
store = stores.TrustedRoot;
//Import the details of the certificate from the server.
X509Certificate x509 = null;
X509CertificateCollection coll = new X509CertificateCollection();
byte[] data = certificate.GetRawCertData();
if (data != null)
x509 = new X509Certificate(data);
//List the details of the Server
//if (bindCount == 1)
//{
Response.Write("<b><u>CERTIFICATE DETAILS:</b></u> <br>");
Response.Write(" Self Signed = " + x509.IsSelfSigned + " X.509 version=" + x509.Version + "<br>");
Response.Write(" Serial Number: " + CryptoConvert.ToHex(x509.SerialNumber) + "<br>");
Response.Write(" Issuer Name: " + x509.IssuerName.ToString() + "<br>");
Response.Write(" Subject Name: " + x509.SubjectName.ToString() + "<br>");
Response.Write(" Valid From: " + x509.ValidFrom.ToString() + "<br>");
Response.Write(" Valid Until: " + x509.ValidUntil.ToString() + "<br>");
Response.Write(" Unique Hash: " + CryptoConvert.ToHex(x509.Hash).ToString() + "<br>");
// }
bHowToProceed = true;
if (bHowToProceed == true)
{
//Add the certificate to the store. This is \Documents and Settings\program data\.mono. . .
if (x509 != null)
coll.Add(x509);
store.Import(x509);
if (bindCount == 1)
removeFlag = true;
}
if (bHowToProceed == false)
{
//Remove the certificate added from the store.
if (removeFlag == true && bindCount > 1)
{
foreach (X509Certificate xt509 in store.Certificates)
{
if (CryptoConvert.ToHex(xt509.Hash) == CryptoConvert.ToHex(x509.Hash))
{
store.Remove(x509);
}
}
}
Response.Write("SSL Bind Failed.");
}
return bHowToProceed;
}
и я использовал его в процессе привязки
// Create Connection
LdapConnection conn = new LdapConnection();
conn.SecureSocketLayer = true;
Response.Write("Connecting to:" + ldapHost);
conn.UserDefinedServerCertValidationDelegate += new
CertificateValidationCallback(MySSLHandler);
if (bHowToProceed == false)
conn.Disconnect();
if (bHowToProceed == true)
{
conn.Connect(ldapHost, ldapPort);
conn.Bind(loginDN, password);
Response.Write(" SSL Bind Successfull ");
conn.Disconnect();
}
quit = false;
ключевые элементы использование обработчика SSL для динамического получения сертификата и использование X509StoreManager.LocalMachine, чтобы при запуске веб-сайта он мог сохранять и извлекать сертификаты.
Я пришел в поисках решения аналогичной проблемы. Моя команда bind также потерпит неудачу при использовании того же кода с веб-сайта Novell. Решением, которое сработало для меня, было добавление динамического обратного вызова проверки сертификата. Вы можете прочитать об этом здесь.
// Creating an LdapConnection instance
LdapConnection ldapConn = new LdapConnection();
ldapConn.SecureSocketLayer = true;
ldapConn.UserDefinedServerCertValidationDelegate += new
CertificateValidationCallback(MySSLHandler);
//Connect function will create a socket connection to the server
ldapConn.Connect(ldapHost, ldapPort);
//Bind function will Bind the user object Credentials to the Server
ldapConn.Bind(userDN, userPasswd);
// Searches in the Marketing container and return all child entries just below this
//container i.e. Single level search
LdapSearchResults lsc = ldapConn.Search("ou=users,o=uga",
LdapConnection.SCOPE_SUB,
"objectClass=*",
null,
false);
while (lsc.hasMore())
{
LdapEntry nextEntry = null;
try
{
nextEntry = lsc.next();
}
catch (LdapException e)
{
Console.WriteLine("Error: " + e.LdapErrorMessage);
// Exception is thrown, go for next entry
continue;
}
Console.WriteLine("\n" + nextEntry.DN);
LdapAttributeSet attributeSet = nextEntry.getAttributeSet();
System.Collections.IEnumerator ienum = attributeSet.GetEnumerator();
while (ienum.MoveNext())
{
LdapAttribute attribute = (LdapAttribute)ienum.Current;
string attributeName = attribute.Name;
string attributeVal = attribute.StringValue;
Console.WriteLine(attributeName + "value:" + attributeVal);
}
}
ldapConn.Disconnect();
Console.ReadKey();
}
public static bool MySSLHandler(Syscert.X509Certificate certificate,
int[] certificateErrors)
{
X509Store store = null;
X509Stores stores = X509StoreManager.CurrentUser;
//string input;
store = stores.TrustedRoot;
X509Certificate x509 = null;
X509CertificateCollection coll = new X509CertificateCollection();
byte[] data = certificate.GetRawCertData();
if (data != null)
x509 = new X509Certificate(data);
return true;
}
91 "не удается подключиться". Попробуйте поставить сервер в " ldap: / / x.X. X. X " формат, убедитесь, что userDN установлен правильно (с доменом и т. д.).
Я часто использую помощью Wireshark чтобы увидеть, что происходит на сетевом уровне (он знает о протоколе LDAP).
Я думаю, что, возможно, я уже предложил этот ответ кому-то другому в другом вопросе.
[OtherQuestion on LDAP][1]
два вопроса, которые я думаю: 1) какую привязку вы пытаетесь сделать? Протокол SSL? Ясный текст? Анонимно?
2) как он настроен на стороне eDirectory для Привязок LDAP?
браузер LDAP инструмента, вы ссылаетесь на тот, который находится по этой ссылке? Бесплатный браузер LDAP
на стороне eDirectory им может потребоваться TLS для все связи LDAP, и они могут запретить анонимные привязки.
можете ли вы попросить людей на другом конце включить трассировку LDAP (используя DStrace с включенной опцией +LDAP, некоторые ссылки для использования Dstrace на Novell eDirectory посмотрите: различные типы захвата Dstrace и понять трассировку DS для Identity Manager.)
это обычно будет показывать сообщение об ошибке, которое просветит вас.
Я предполагаю, что либо требуется TLS включен, и вы не можете быть выполнение успешной привязки SSL.
Если это так, попробуйте подключиться к порту 636 с включенным SSL и полным DN для пользователя, которого вы пытаетесь войти в систему.
Если вы пытаетесь с включенным SSL, и вы не получаете всплывающее окно о принятии доверенного корневого сертификата дерева CA, то, возможно, сертификат CA или SSL taht сервер eDirectory является пользователем истек или сломан. (Для этого есть множество причин, которые могут быть общими и занять всего мгновение фиксировать.)
обычно в Dstrace вы увидите ошибку о сертификате SSL, если есть проблема. Пример с точки зрения Novell Identity Manager истекшего сертификата приведен в этой статье: Срок действия сертификата истек, а также некоторые сведения о том, как исправить сертификаты.
следующая возможность заключается в том, что DN, который вы указываете, не совсем корректен.
Дайте мне знать, если вам нужна дополнительная помощь.
Я работаю над интеграцией Forefront Identity Manager. Поэтому код, который я пишу, всегда приходит от нескольких клиентов. Это может быть неуместно, если вы пытаетесь упаковать приложение для использования "в любом месте".
Я просто хотел обновить этот поток простым решением для серверов Novell, на которых включена опция "конфиденциальность по умолчанию TLS/SSL".
1) Убедитесь, что вы получаете SSL-сертификаты с сервера Novell, который вы связываете, и регистрируетесь те, которые находятся в доверенном хранилище на исполняющем клиенте / сервере. Обычно есть два 1 для IP и для имени хоста, зависящего от которого вы будете вызывать (DNS предпочтительнее)
2) импортируйте следующие / добавьте ссылки использование системы.Каталог; использование системы.DirectoryServices.Протоколы;
3) Вот фрагмент. Убедитесь, что вы выбрали AuthenticationTypes.SecureSocketsLayer, который является ключевым.
// serverAddress = Server IP or DNS (Match SSL certificate)
// ObjectDN = The DN of the user you are binding to
// userName = Account which will be used to make the bind
// password = password of the user which will make the bind
// value = The value you wish to add to the attribute
// Connect to the user in LDAP
DirectoryEntry entry = new DirectoryEntry("LDAP://" + serverAddress + "/" + ObjectDN + ""
, userName
, password
, AuthenticationTypes.SecureSocketsLayer);
// Write the Updated attribute
entry.Properties["attribute"].Value = value;
// Read back the updated Attribute into a label
label.Text = entry.Properties["attribute"].Value.ToString();
после моего предыдущего сообщения - если вам нужно использовать безопасное соединение, попробуйте использовать ldaps: / / в качестве префикса адреса сервера.
Если нет поддержки SSL / TLS, вы можете попробовать этой - рекомендации и .NET-оболочка для библиотеки OpenLDAP.
один важный момент - в OpenLDAP есть настройки уровня безопасности TLS, поэтому, если ваш сервер LDAP имеет самозаверяющий сертификат, вам нужно либо импортировать его на стороне клиента, либо установить TLS, чтобы не проверять подпись авторитет *это, конечно, менее безопасно).