2

在我验证用户存在后,我正在努力使用 LDAP 从 AD 返回用户详细信息。我正在使用一个简单的身份验证方法,如下所示:

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 连接中,我不会以纯文本形式发送密码!

4

1 回答 1

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参数服务的唯一目的是授权访问path所指的任何实体。

由于您目前拥有东西,因此您绑定到域,而不是用户(但您有权以该用户的身份连接到域)。

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

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

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

如果您只有一个用户名,则需要搜索sAMAccountName. 如果您有一个旧式域名 ( domain\user),那么通常您希望将其拆分为\,丢弃该域名,然后仍然在 上搜索sAMAccountName

Filter在属性文档中可以找到一些(但不是太多!)关于构造过滤器参数的帮助。

于 2012-05-31T10:03:54.770 回答