«Указанный домен либо не существует, либо с ним нельзя связаться» - PullRequest
2 голосов
/ 21 октября 2009

Я пытаюсь использовать встроенную аутентификацию Windows в сочетании с DirectorySearcher для идентификации и аутентификации пользователя в интрасети.

Мне удалось получить довольно простой код, который, казалось бы, добился цели, но когда я попробовал на живом сервере, я получил следующую ошибку:

"Указанный домен либо не существует, либо с ним невозможно связаться"

Я не могу отладить приложение на работающем сервере, поэтому скопировал его на старый сервер разработки для тестирования там. Когда я нормально запустил приложение, оно показало ту же ошибку, поэтому я попытался отладить в 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

Ответы [ 3 ]

2 голосов
/ 21 октября 2009

Я обнаружил, что гораздо проще использовать пространство имен 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
1 голос
/ 19 января 2012

Вот еще один способ достижения той же функциональности:

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;

Это сработало для меня.

1 голос
/ 21 октября 2009

Однажды у меня возникла та же проблема, и я понял, что причиной ошибки было то, как был написан URL.

При использовании AD и ADSI убедитесь, что вы используете пути "UPPER CASE". Как я вижу из вашего кода, вы пишете «cn» в нижнем регистре. [Функция GetGroups]

Другой способ, которым я хотел бы попробовать, - убедиться, что вы правильно используете " connectionstring ", которую вы используете.

LDAP: // CN = "+ username +", OU = "+ OU +", OU = myOU, DC = myDC1, DC = myDC2 ";

1012 * становится *

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

где " orgname " - это имя сервера, на котором работает AD.

Надеюсь, это поможет.

...