我正在尝试为我的.Net应用程序构建一个功能,以便能够与LDAP服务器通信以读取用户属性并验证用户身份。我使用OpenDS设置了测试目录服务器,添加了自定义属性和对象,并添加了具有新对象类型的用户。一切正常,直到我尝试读取自定义属性值,我得到:
{"Unknown error (0x8000500c)"}
at System.DirectoryServices.PropertyValueCollection.PopulateList()
at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
我尝试了this post的建议(使用正确形成的oid)以及this post(在ldap路径中使用完全限定的域名 - 我使用的是像LDAP://mymachine.company .local / ...)。 Others have suggested由于COM错误代码意味着E_ADS_CANT_CONVERT_DATATYPE我的属性或架构有问题,但属性设置为DirectoryString,还有其他我可以读取的相同类型的默认字段。
我知道使用OpenDS与Active Directory的工作方式不同,我有一个单独的AD模块,工作正常,我只是想知道是否有人有过与OpenDS或Sun One LDAP实现交流的经验。 / p>
思考?我在谷歌处理OpenDS和.NET时找不到太多东西,这让我觉得我应该做其他事情。正如我所说AD的工作正常,但我真的希望能够用OpenDS做到这一点。
谢谢!
生锈
答案 0 :(得分:0)
使用已知良好的工具(例如ldapsearch
)来验证LDAP客户端是否确实可以请求和接收所需的条目和属性。例如:
ldapsearch --hostname hostname \
--port port \
--bindDn your-auth-id \
--bindPassword credentials-for-your-auth-id \
--useSSL \
--trustAll \
--baseDn your-base-object \
--searchScope the-scope-you-use \
'(&)' \
your-custom-attribute-names
使用与LDAP客户端代码中相同的参数。如果上述搜索成功,则表明服务器配置正确,条目存在,并且auth ID有权检索这些条目和自定义属性。否则,它们可能是LDAP客户端代码中的问题。
答案 1 :(得分:0)
我尝试从linux OpenLdap数据库中读取多值字符串时遇到此错误。
这似乎是一个错误,因为我发现XP和Server 2003上发生了错误,但无论安装的是什么.NET版本,Windows 7和Server 2008上的相同代码都会返回值。
但是我找到了一个使用更直接访问的C#解决方法。除了Directory.Services之外,您还需要添加引用COM,“Active DS Type Library”。
var dirEntry = new DirectoryEntry("ldapDn", "logonDn", "logonPass");
var nativeEntry = (ActiveDs.IADsPropertyList)dirEntry.NativeObject;
var propEntry = (ActiveDs.IADsPropertyEntry)nativeEntry.GetPropertyItem("attributeName", 3);
foreach (ActiveDs.IADsPropertyValue propValue in (object[])propEntry.Values)
{
Debug.Print(propValue.CaseIgnoreString);
}
这是为了我自己的简单需求,这里是the full helper class used as a reference以及AdsType Enums。