Политика паролей Openldap supportedControl

#.net #ldap #policy #openldap

#.net #ldap #политика #openldap

Вопрос:

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

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

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

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

для использования поискового запроса, заполненного DirectoryControl, настроенного для запроса

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

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

Вот некоторый код, который я пытался:

     _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 amp;amp; 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 amp;amp; c.GetLength(0) > 0)
  {
     Debug.WriteLine(c[0].Type   " value: "   c[0].GetValue());
  }  
  return true;
}
catch (LdapException ex)
{
  Debug.WriteLine(ex.Message);
}
  

Комментарии:

1. Вы определили, что идентификатор аутентификации, который вы используете для установки состояния авторизации (с привязкой), разрешен для использования этого элемента управления запросом?

2. ничто в выходных данных ‘slapd -d -1’ не указывает на наличие проблемы с разрешениями

3. Я должен был быть более ясным: в журналах сервера каталогов указано, что запрос не выполнен, поскольку состояние авторизации не имеет разрешения на использование этого элемента управления? Кстати, не включайте OID элемента управления ответом в запрос. Элемент управления ответом, если он присутствует, отображается в ответе от сервера.

Ответ №1:

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

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

Комментарии:

1. Я также видел информацию об истечении срока действия пароля в запросах привязки. Я полагаю, что это отправляется обратно на запросы аутентификации, выполняемые модулем PAM slapd-search. Я кратко рассмотрел использование модуля PAM для Windows, но это не лучшее решение, IMO. Сегодня мы просто запрашиваем политику и выполняем все вычисления самостоятельно. Вот и все для элементов управления Openldap! Я никогда не мог заставить ни один из них работать. Я думаю, что проблема заключается в Openldap. Я собираюсь изучить исправление ошибки в исходном коде Openldap, как только здесь все станет совсем по-другому.