Openldap поддерживает политику управления паролями

Список поддерживаемых OpenldapControl: 1.3.6.1.4.1.42.2.27.8.5.1 (политика паролей)

Используя .Net DirectoryServices.Protocols, я исчерпал все возможные методы получения ответной информации, предоставляемой этим элементом управления.

Я использую последний исходный код Openldap, созданный/запущенный локально в среде Cygwin, со всей конфигурацией, связанной с PPolicy, включенной в сборке, и настроенной и работающей/проверенной PPolicy.

Изменив пример из руководства по программированию служб каталогов, перейдите по ссылке: http://dunnry.com/blog/2006/05/11/DotNetDevGuideToDirectoryServicesCompanionSiteLaunched.aspx

, чтобы использовать SearchRequest, заполненный DirectoryControl, настроенным для запроса

Политика паролей ничего мне не дает. В исходном коде сервера все выглядит хорошо: http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob_plain;f=servers/slapd/overlays/ppolicy.c;hb=HEAD

Кому-нибудь повезло с использованием .Net DirectoryControls в SearchRequest?

Вот код, который я пробовал:

    _authConnect.AuthType = AuthType.Basic;
// credentials.UserName is a user DN format, w/password and null domain
_authConnect.Credential = credentials;
Debug.WriteLine("PV: " + _authConnect.SessionOptions.ProtocolVersion);

var sr = //new ExtendedRequest();
         new SearchRequest(credentials.UserName, "(objectclass=*)", SearchScope.Base, null);
         //new DsmlAuthRequest(credentials.UserName);
        var isCritical = false;
    var ppolicy = "1.3.6.1.4.1.42.2.27.8.5.1";
        // ppolicy request and response control is referred to by the same OID
        sr.Controls.Add(new DirectoryControl(ppolicy, null, isCritical, true));
    sr.Controls.Add(new DirectoryControl(ppolicy, new byte[8], isCritical, false));

try
{
  var response = (SearchResponse)_authConnect.SendRequest(sr);
  DirectoryControl[] c = response.Controls;
  if (c.Rank > 0 && c.GetLength(0) > 0)
  {
     Debug.WriteLine(c[0].Type + " value: " + c[0].GetValue());
  }
  SearchResultEntry entry = response.Entries[0];
  c = entry.Controls;
  if (c.Rank > 0 && c.GetLength(0) > 0)
  {
     Debug.WriteLine(c[0].Type + " value: " + c[0].GetValue());
  }  
  return true;
}
catch (LdapException ex)
{
  Debug.WriteLine(ex.Message);
}

person ticktock    schedule 02.05.2011    source источник
comment
Вы определили, что удостоверению аутентификации, которое вы используете для установки состояния авторизации (с привязкой), разрешено использовать этот элемент управления запросом?   -  person Terry Gardner    schedule 05.08.2011
comment
ничто в выводе 'slapd -d -1' не указывает на проблему с правами доступа   -  person ticktock    schedule 06.08.2011
comment
Я должен был быть более ясным: указывают ли журналы сервера каталогов, что запрос не выполнен, потому что состояние авторизации не имеет разрешения на использование этого элемента управления? Кстати, не включайте OID управления ответом в запрос. Элемент управления ответом, если он присутствует, отображается в ответе сервера.   -  person Terry Gardner    schedule 08.08.2011


Ответы (1)


У меня была та же проблема, что и у вас, и я безуспешно пробовал много вещей, а затем не хватило времени. Проблема, как я заметил, заключалась в том, что openldap отправлял только информацию об истечении срока действия пароля в запросе на привязку. Я узнал это, включив все журналы на сервере. Поэтому я пытался найти способ использовать элементы управления каталогом с запросом на привязку. Не было способа сделать это с помощью класса SDSP LdapConnection, который я смог найти. Затем я занялся хакерством с отражением в объекте подключения и захватом переменной ldaphandle. С этим я мог бы использовать его для вызова c-api напрямую, как это делает SDSP. Я просмотрел исходники openldap и заметил, что его инструменты используют механизм привязки sasl без механизма, который в этой библиотеке прибегает к простой привязке с элементами управления. Это не работает так же в winldap. Если вы это сделаете, он вернет неверный код ответа параметра. Последнее, что я пробовал, это вызвать асинхронную версию ldap_bind и прочитать сообщение. К сожалению, никаких элементов управления никогда не было в ответе. Я думаю, что, поскольку я не отправлял их, они не возвращались, хотя в файле журнала openldap говорилось, что он устанавливает предупреждение. Это была моя единственная надежда на использование любого из встроенных методов привязки winldap.

Последнее, что я собирался попробовать, но у меня не хватило времени, это создать собственное сообщение о привязке с элементами управления и отправить их на сервер с помощью функции ldap_extended_operation_s. http://msdn.microsoft.com/en-us/library/aa366580(v=VS.85).aspx Если у меня будет дополнительное время на этот проект, я могу вернуться и попробовать его. Если сделаю, отчитаюсь здесь. В конечном счете, если это решение, может быть проще использовать библиотеку ldapsharp от Novell. Похоже, что можно отправить запрос на привязку с помощью серверных элементов управления. Я изучил winldap API только потому, что я немного знаком с ним, и мы уже достаточно укоренились в использовании DirectoryServices.Protocols.

person Sam Corder    schedule 05.08.2011
comment
Я также видел информацию об истечении срока действия пароля в запросах на привязку. Я считаю, что это возвращается к запросам аутентификации, сделанным модулем PAM + slapd-search. Я кратко изучил использование модуля PAM для Windows, но это не лучшее решение, IMO. Сегодня мы просто запрашиваем полис и сами делаем все расчеты. Вот вам и элементы управления Openldap! Я никогда не мог заставить ни одного из них работать. Я думаю проблема кроется в Openldap. Я собираюсь найти исправление в исходном коде Openldap, как только все уляжется. - person ticktock; 06.08.2011