Openldap支持控制密码策略

时间:2011-05-02 16:01:22

标签: .net ldap policy openldap

Openldap supportedControl列出:1.3.6.1.4.1.42.2.27.8.5.1(密码策略)

使用.Net DirectoryServices.Protocols,我已经用尽所有可能的方法来检索此控件提供的响应信息。

我正在使用Cygwin环境中本地构建/运行的最新Openldap Source,并在构建中启用了所有与PPolicy相关的配置,并且PPolicy已配置并正在运行/测试。

通过修改目录服务编程指南中的示例,链接: http://dunnry.com/blog/2006/05/11/DotNetDevGuideToDirectoryServicesCompanionSiteLaunched.aspx

,使用填充了配置为请求

的DirectoryControl的SearchRequest

密码政策,什么都没有。 服务器源中的一切看起来都很好: http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob_plain;f=servers/slapd/overlays/ppolicy.c;hb=HEAD

在SearchRequest中使用.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 && 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 :(得分:0)

我遇到了和你一样的问题,并尝试了很多不成功的事情,然后没时间了。我注意到的问题是openldap只是在绑定请求中发送密码过期信息。我通过启用服务器上的所有日志记录找到了这个。所以我试图找到一种方法来使用带有绑定请求的目录控件。使用我能找到的S.DS.P LdapConnection类没有办法做到这一点。然后我开始讨论反射到连接对象并抓住ldaphandle变量。有了它,我可以像S.DS.P那样直接调用c-api。我环顾了openldap源代码并注意到它的工具使用了一个sasl绑定机制,没有任何机制,该机制在该库中重新回到与控件的简单绑定。它在winldap中的工作方式不同。如果这样做,它将返回错误的参数响应代码。我尝试的最后一件事是调用ldap_bind的异步版本并回读消息。遗憾的是,答案中没有任何控件。我认为,因为我没有发送它们,即使openldap日志文件说它正在设置警告,它们也没有被返回。这是我使用任何内置winldap绑定方法的唯一希望。

我要尝试但最后用完的最后一件事就是使用控件构建我自己的绑定消息,并使用ldap_extended_operation_s函数将它们发送到服务器。 http://msdn.microsoft.com/en-us/library/aa366580(v=VS.85).aspx如果我在这个项目上得到一些额外的时间,我可以回去尝试一下。如果我这样做,我会在这里报告。最终,如果这是解决方案,那么使用Novell的ldapcsharp库可能会更容易。看起来可以使用服务器控件发送绑定请求。我只是探讨了winldap api,因为我对它有些熟悉,而且我们已经非常根深蒂固使用DirectoryServices.Protocols。