在我验证用户存在之后,我很难使用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连接中,我不是用纯文本发送密码!
答案 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
处的对象。 username
和password
参数所服务的唯一目的是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中有一些(但不是太多!)有关构建滤镜参数的帮助。