3

我正在尝试将集成 Windows 身份验证与 DirectorySearcher 结合使用来识别和验证 Intranet 用户。

我设法获得了一些似乎可以解决问题的相当简单的代码,但是当我在实时服务器上尝试时,出现以下错误:

“指定的域不存在或无法联系”

我无法在实时服务器上调试应用程序,因此我将其复制到旧的开发服务器上进行测试。当我正常运行该应用程序时,它出现了相同的错误,因此我尝试在 VS 中进行调试....除了它运行良好。

我怀疑这与模拟或与 LDAP 调用有关 - 显然,当它适用于调试器时,很难确定真正的问题是什么。

但我认为你们中的一个人能够为我指明正确的方向。

我的身份验证类的片段:

Private Function GetUserID() As String
    Dim sID As String = HttpContext.Current.User.Identity.Name
    Return Mid(sID, InStr(sID, "\") + 1)
End Function

Private Function GetDisplayName() As String
    Dim oSearcher As New DirectorySearcher
    Dim oResult As SearchResult
    Dim sName As String = String.Empty

    With oSearcher
        .Filter = String.Format("(SAMAccountName={0})", _UserID)
        .PropertiesToLoad.Add("displayName")
        oResult = .FindOne()
        If Not oResult Is Nothing Then
            sName = oResult.Properties("displayName")(0).ToString()
        End If
    End With

    Return sName
End Function
Private Function GetEmail() As String
    Dim oSearcher As New DirectorySearcher
    Dim oResult As SearchResult
    Dim sEmail As String = String.Empty

    With oSearcher
        .Filter = String.Format("(SAMAccountName={0})", _UserID)
        .PropertiesToLoad.Add("mail")
        oResult = .FindOne()
        If Not oResult Is Nothing Then
            sEmail = oResult.Properties("mail")(0).ToString()
        End If
    End With

    Return sEmail

End Function

Private Function GetGroups() As StringCollection
    Dim oSearcher As New DirectorySearcher
    Dim oResult As SearchResult
    Dim colGroups As New StringCollection
    Dim i As Int16

    With oSearcher
        .Filter = String.Format("(cn=" & _UserName & ")", _UserID)
        .PropertiesToLoad.Add("memberOf")
        oResult = .FindOne()

        If Not oResult Is Nothing Then
            Dim iGroupCount As Int16 = oResult.Properties("memberOf").Count

            For i = 0 To iGroupCount - 1
                colGroups.Add(oResult.Properties("memberOf")(i).ToString())
            Next

        End If
    End With

    Return colGroups
End Function
4

4 回答 4

3

我发现使用 System.DirectoryServices.AccountManagement 命名空间来处理这种事情要容易得多,在您的情况下, UserPrincipal 类是您的朋友。

Private Function GetEmail() As String
        Dim pc As PrincipalContext = new PrincipalContext(ContextType.Domain)
        Dim wi As WindowsIdentity = HttpContext.Current.User.Identity
        Dim up As UserPrincipal = UserPrincipal.FindByIdentity(pc, wi.Name)

        Return up.EmailAddress
End Function
于 2009-10-21T17:42:11.740 回答
1

我曾经遇到过同样的问题,我发现错误的原因是 url 的编写方式。

使用 AD 和 ADSI 时,请确保您使用的是“大写”路径。正如我从您的代码中看到的那样,您将“cn”写为小写。[获取组函数]

我会尝试的另一种方法是确保您正确使用您正在使用的“连接字符串”。

LDAP://CN="+用户名+",OU="+OU+",OU=myOU,DC=myDC1,DC=myDC2";

变成

LDAP:// orgname .ad.root/CN=" + username + ",OU=" + OU + ",OU=myOU,DC=myDC1,DC=myDC2";

其中“ orgname ”是运行 AD 的服务器名称。

希望这可以帮助。

于 2009-10-21T16:18:26.013 回答
1

这是实现相同功能的另一种方法:

string fullPath = "LDAP://abc.xyz.com/DC=xyz, DC=com";
AuthenticationTypes authType = AuthenticationTypes.None;
DirectoryEntry verifiedUser = new DirectoryEntry(fullPath, txtUserName.Text.Trim(), txtPassword.Text.Trim(), authType);
verifiedUser.RefreshCache();
isAuthorisedUser = true;

这对我有用。

于 2012-01-18T22:08:26.150 回答
0

这很可能是一个权限问题:在您的开发机器上进行本地测试时,它可以正常工作,因为您使用您的帐户访问了 AD。在 Live 服务器上,您可能在无权访问 AD 的服务帐户下运行应用程序。

于 2021-10-21T14:38:20.523 回答