LDAP用户属性请求返回异常结果

时间:2012-05-31 07:41:01

标签: asp.net vb.net ldap

在我验证用户存在之后,我很难使用LDAP从AD返回用户详细信息。 我使用简单的auth方法如下:

Function AuthenticateUser(path As String, user As String, pass As String) As Boolean
    Dim de As New DirectoryEntry(path, user, pass, AuthenticationTypes.Secure)
    Try
        Dim ds As DirectorySearcher = New DirectorySearcher(de)
        Dim result As SearchResult = ds.FindOne()

        If result Is Nothing Then Return False


'>>DEBUG OUTPUTS ONLY:
        displayName.Text = result.GetDirectoryEntry().Properties.Item("distinguishedName").Value
        displayName.Text += result.GetDirectoryEntry().Properties("name").Value


        Return True
    Catch
        Return False
    End Try
End Function

问题是“distinguishedName”返回“DC = our-domain,DC = co,DC = uk” 并且“name”只返回“our-domain”,而不是刚刚被授权的用户的名称

注意:displayName.text输出纯粹用于调试目的

我尝试过多种请求组合,但似乎没有任何内容返回用户详细信息。

ETA:对安全警察:这都在https连接中,我不是用纯文本发送密码!

1 个答案:

答案 0 :(得分:2)

1. Dim de As New DirectoryEntry(path, user, pass, AuthenticationTypes.Secure)
2. Try
3.    Dim ds As DirectorySearcher = New DirectorySearcher(de)
4.    Dim result As SearchResult = ds.FindOne()

第1行基本上是创建DirectoryEntry元素,它引用path处的对象。 usernamepassword参数所服务的唯一目的是authorise访问path所指的任何实体。

正如您目前所拥有的那样,您将绑定到域,而不是绑定到用户(但您已授权以该用户身份连接到域)。

然后,在第3行中,创建一个DirectorySearcher。但是你正在使用的构造函数只是说de的搜索根源(我们已经建立的只是域)。您还没有做任何事情来搜索域中的特定用户 - 他们可以连接以执行几乎任何可以想象的搜索。

您可能想要做的是查看Directory {{}}的DirectorySearcher的重载,并提供将搜索限制为仅限用户的过滤器参数。我不知道您的user参数的格式是什么 - 例如,如果是以用户主体名称(user@domain)的形式,您可以尝试指定以下过滤器:

Dim ds As DirectorySearcher = New DirectorySearcher(de,"(userPrincipalName=" + user + ")")

如果您只有一个用户名,则需要搜索sAMAccountName。如果您使用的是较旧的域名(domain\user),那么通常您希望将其拆分为\,弃掉域名,然后继续搜索sAMAccountName

accepts a filter parameter中有一些(但不是太多!)有关构建滤镜参数的帮助。