& # 8220; Le domaine spécifié n'existe pas ou n'a pas pu être contacté & # 8221;

StackOverflow https://stackoverflow.com/questions/1601875

  •  05-07-2019
  •  | 
  •  

Question

J'essaie d'utiliser l'authentification Windows intégrée associée à DirectorySearcher pour identifier et authentifier l'utilisateur intranet.

J'avais réussi à obtenir un code assez simple qui semblait faire l'affaire, mais lorsque j'ai essayé sur le serveur live, l'erreur suivante s'est produite:

"Le domaine spécifié n'existe pas ou n'a pas pu être contacté"

.

Je ne peux pas déboguer l'application sur le serveur live, je l'ai donc copiée sur un ancien serveur de développement pour la tester. Lorsque j'ai exécuté l'application normalement, la même erreur s'est produite. J'ai donc essayé de déboguer sous VS .... sauf que cela fonctionnait parfaitement.

Je suppose que cela a quelque chose à voir avec l'usurpation d'identité ou avec l'appel LDAP. Évidemment, lorsque cela fonctionne pour le débogueur, il est difficile de savoir avec certitude quel est le véritable problème.

Mais j’ai pensé que l’un de vous deux pourrait me diriger dans la bonne direction.

Extraits de code de ma classe d'authentification:

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
Était-ce utile?

La solution

J'ai beaucoup plus de facilité à utiliser l'espace de noms System.DirectoryServices.AccountManagement pour ce genre de choses. Dans votre cas, la classe UserPrincipal est votre ami.

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

Autres conseils

J'ai déjà eu le même problème et j'ai compris que la cause de l'erreur était la façon dont l'URL était écrite.

Lorsque vous utilisez AD et ADSI, assurez-vous que vous utilisez "UPPER CASE". chemins. Comme vous pouvez le constater d'après votre code, vous écrivez " cn " comme minuscule. [Fonction GetGroups]

Je voudrais également essayer de vous assurer que vous utilisez correctement la " chaîne de connexion ". vous utilisez.

LDAP: // CN = " + nom d'utilisateur + ", OU = " + OU + ", OU = myOU, DC = monDC1, DC = monDC2";

devient

LDAP: // orgname .ad.root / CN = " + nom d'utilisateur + ", OU = " + OU + ", OU = monOU, DC = monDC1, DC = monDC2";

où " orgname " c'est le nom du serveur sur lequel AD s'exécute.

J'espère que cela vous aidera.

Voici un autre moyen d'obtenir les mêmes fonctionnalités:

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;

Cela a fonctionné pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top