Openldap поддерживает управление паролем - PullRequest
2 голосов
/ 02 мая 2011

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

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

Я использую последнюю версию Openldap Source, собранную / работающую локально в среде 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);
}

1 Ответ

0 голосов
/ 06 августа 2011

У меня была такая же проблема, как у вас, и я много раз безуспешно пробовал, а потом не хватило времени. Проблема, как я заметил, заключалась в том, что openldap только отправлял информацию об истечении срока действия пароля в запросе bind. Я выяснил это, включив все журналы на сервере. Поэтому я попытался найти способ использовать элементы управления каталогами с запросом на привязку. Не было способа сделать это с помощью класса S.DS.P LdapConnection, который я мог найти. Затем я начал взламывать объект подключения и перехватывать переменную 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.Protocols.

...