Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中通过System.DirectoryServices查询自定义LDAP属性?_C#_Asp.net_.net_Ldap_Openldap - Fatal编程技术网

在C#中通过System.DirectoryServices查询自定义LDAP属性?

在C#中通过System.DirectoryServices查询自定义LDAP属性?,c#,asp.net,.net,ldap,openldap,C#,Asp.net,.net,Ldap,Openldap,我在OpenLDAP服务器上安装了一个自定义LDAP架构,如下所示: attributeType ( 999.0.01 NAME 'picturePath' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} ) objectClass ( 999.1.01 NAME 'indieStackTeam

我在OpenLDAP服务器上安装了一个自定义LDAP架构,如下所示:

attributeType ( 999.0.01
    NAME 'picturePath'
    EQUALITY caseIgnoreMatch
    SUBSTR caseIgnoreSubstringsMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024}
    )

objectClass ( 999.1.01
    NAME 'indieStackTeam'
            DESC 'Team definition for IndieStack'
    SUP groupOfUniqueNames
    STRUCTURAL
            MAY     ( picturePath )
    )
在我的ASP.NET MVC 2应用程序中,我像这样查询picturePath属性(并确认picturePath存在于键列表中):

当我尝试在.NET 3.5下执行此操作时,会出现以下异常:

[COMException (0x8000500c): Unknown error (0x8000500c)]   
    System.DirectoryServices.PropertyValueCollection.PopulateList() +347013
    System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) +49   
    System.DirectoryServices.PropertyCollection.get_Item(String propertyName) +150
然而,当相同的代码在Mono下运行时(与OpenLDAP在同一台服务器上),它工作得非常好。诸如LDAPAdmin之类的客户端也可以正确读取picturePath属性

更重要的是,只有当我去读取值时,它才会失败;我可以在钥匙列表中看到该属性,但我无法访问它

不幸的是,未知错误并没有告诉我出了什么问题,但我发现System.DirectoryServices的.NET实现非常脆弱(如果使用“DC=”中的小写字母连接到LDAP服务器,则会出现相同的未知错误)


以前有人遇到过这个问题吗?如果有,是如何解决的?

您应该检查两件事:

1) 该特定用户对象是否确实在
picturePath
中有值?在访问属性之前,您可能需要检查该属性是否存在:

if(properties.Contains("picturePath") && properties["picturePath"].Count > 0)
{
   ....
}
2) 如果我没记错的话,要访问自定义属性,您应该在执行任何操作之前显式刷新用户对象的缓存:

DirectoryEntry de = ......;  // find / assign that DirectoryEntry somehow

de.RefreshCache();  // to load all properties from the directory
或:


另外:
System.DirectoryServices
中的类实际上主要是针对Active Directory使用的-当针对其他LDAP服务器(如OpenLDAP)使用时,可能会出现“意外”或微妙的不兼容

似乎.NET LDAP客户端希望属性类型和对象类的OID格式正确

您会注意到,我使用的是999.X.YY形式的OID,虽然它们在语法上可能是正确的,但在现实世界中通常不会遇到。我的猜测是LDAP客户端解析OID,因为这些OID不符合预期,所以会抛出一个错误


我将OID分别更改为1.3.6.1.4.1.40000.1.3.1和1.3.6.1.4.1.40000.1.4.1(我还申请了PEN,它将给我分配一个编号而不是“40000”),刷新服务器中的架构并重新创建条目,LDAP客户端现在可以正确读取自定义属性。

这不会回答您的问题,但是是对
picturePath
属性的一般性评论。这个属性似乎代表一个文件系统上的路径名,所以你应该考虑使用<代码> IA5Stult语法和适当的匹配规则和排序规则。您应该了解一下如何使用Novell目录服务库。您可以通过添加Novell.Directory.Ldap程序集在Mono下添加对它的引用。刷新缓存似乎没有任何效果,并且使用属性。Contains(“picturePath”)会引发相同的“未知错误”异常。我已经看过Novell服务库,但它的功能似乎并不全面(它没有提供一种方法来列出我所能看到的条目的所有属性以及其他类似问题)。这里的此类将使用Novell目录服务库获取给定条目的所有属性(名称和值)。
DirectoryEntry de = ......;  // find / assign that DirectoryEntry somehow

de.RefreshCache();  // to load all properties from the directory
de.RefreshCache(new string[] { "picturePath" });  // to just load the "picturePath" attribute