在Active Directory中查找用户的不同方法

时间:2012-11-26 16:33:58

标签: asp.net vb.net active-directory ldap

我是AD编程的新手,但经过几周的研究,我发现以下三种方法使用帐户名作为搜索参数搜索Active Directory中的用户:

选项1 - FindByIdentity

Dim ctx As New PrincipalContext(ContextType.Domain, Environment.MachineName)
Dim u As UserPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "MYDOMAIN\Administrator")
If u Is Nothing Then
    Trace.Warn("No user found.")
Else
    Trace.Warn("Name=" & u.Name)
    Trace.Warn("DisplayName=" & u.DisplayName)
    Trace.Warn("DistinguishedName=" & u.DistinguishedName)
    Trace.Warn("EmployeeId=" & u.EmployeeId)
    Trace.Warn("EmailAddress=" & u.EmailAddress)
End If

选项2 - DirectorySearcher

Dim connPath As String = "LDAP://" & Environment.MachineName
Dim de As New DirectoryEntry(connPath)
Dim ds As New DirectorySearcher(de)
ds.Filter = String.Format("(&(objectClass=user)(anr={0}))", Split(User.Identity.Name, "\")(1))
ds.PropertiesToLoad.Add("name")
ds.PropertiesToLoad.Add("displayName")
ds.PropertiesToLoad.Add("distinguishedName")
ds.PropertiesToLoad.Add("employeeId")
ds.PropertiesToLoad.Add("mail")
Dim src As SearchResult = ds.FindOne()
If src Is Nothing Then
    Trace.Warn("No user found.")
Else
    For Each propertyKey As String In src.Properties.PropertyNames
        Dim valueCollection As ResultPropertyValueCollection = src.Properties(propertyKey)
        For Each propertyValue As Object In valueCollection
            Trace.Warn(propertyKey & "=" & propertyValue.ToString)
        Next
    Next
End If

选项3 - PrincipalSearcher

Dim ctx2 As New PrincipalContext(ContextType.Domain, Environment.MachineName)
Dim sp As New UserPrincipal(ctx2)
sp.SamAccountName = "MYDOMAIN\Administrator"
Dim s As New PrincipalSearcher
s.QueryFilter = sp
Dim p2 As UserPrincipal = s.FindOne()
If p2 Is Nothing Then
    Trace.Warn("No user found.")
Else
    Trace.Warn(p2.Name)
    Trace.Warn(p2.DisplayName)
    Trace.Warn(p2.DistinguishedName)
    Trace.Warn(p2.EmployeeId)
    Trace.Warn(p2.EmailAddress)
End If

这三种方法都返回相同的结果,但我想知道是否有任何特定方法比其他方法更好或更差?

选项1或3似乎是最好的,因为它们提供了强类型的属性名称,但我可能错了?我的总体目标是在网站上使用Windows身份验证时,根据通过Web浏览器传递的用户主体值在AD中查找单个用户(例如“MYDOMAIN \ MyUserAccountName”)

1 个答案:

答案 0 :(得分:1)

对我来说,1和3完全相同。在Querying an LDAP in C#回答中,我介绍了使用托管代码的第三种方法,即使用System.DirectoryServices.Protocols (S.DS.P)的低级别(本机LDAP)协议。

我不知道您的目的只是验证用户身份或验证用户身份并从Active-Directory检索某些数据(配置文件),但请记住,LDAP查询首先是查询,而旧时尚(您的解决方案2)让您指定要检索的属性。在选择之前,先从性能的角度进行一些测试。

如果您只想进行身份验证,可以比较其他文章中的native LDAPuser Principal个回复