2011-05-02 108 views
2

OPENLDAP supportedControl上市:1.3.6.1.4.1.42.2.27.8.5.1(密码策略)OPENLDAP supportedControl密码策略

使用.net DirectoryServices.Protocols,我已经用尽提供检索响应信息的所有可能的方法通过这种控制。

我使用的是最新的OpenLDAP源建/在Cygwin环境与构建启用的所有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

有没有人有使用的.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); 
} 
+0

是否确定了身份验证使用设置授权状态(使用绑定)被允许使用该请求控制? – 2011-08-05 16:30:07

+0

没有从输出“的slapd -d -1”表明存在一个权限问题 – ticktock 2011-08-06 14:47:36

+0

我应该更清楚:做目录服务器日志表明,请求失败,因为授权状态不必使用控制权限?顺便说一句,请不要在请求中包含响应控制OID。响应控制(如果存在)显示在来自服务器的响应中。 – 2011-08-08 10:43:35

回答

0

我有同样的问题,因为你并没有成功尝试了很多东西,然后跑出来的时候。我注意到的问题是,openldap仅在绑定请求中发送密码过期信息。通过启用服务器上的所有日志记录,我发现了这一点。所以我试着找到一种使用绑定请求来使用目录控件的方法。没有办法使用我能找到的S.DS.P LdapConnection类来完成它。然后我开始反思连接对象并抓取ldaphandle变量。我可以用它直接调用c-api,就像S.DS.P一样。我环顾了一下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已经非常稳固。

+0

我在绑定请求中看到了密码过期信息。我相信这会返回到由PAM模块+ slapd-search所做的身份验证请求。我简要介绍了如何使用适用于Windows的PAM模块,但这不是IMO的最佳解决方案。今天,我们只是要求政策,并自己做所有的计算。对于OpenLDap控件来说非常重要!我永远无法让他们工作。我认为问题在于Openldap。一旦事情发生在这里,我将研究OpenLDap源代码中的错误修正。 – ticktock 2011-08-06 15:05:42