& # 8220; Le domaine spécifié n'existe pas ou n'a pas pu être contacté & # 8221;
-
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
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.