我正在尝试使用集成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
答案 0 :(得分:2)
我发现在这种情况下使用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 :(得分:1)
我曾经遇到过同样的问题,我发现错误的原因就是网址被写入的方式。
使用AD和ADSI时,请确保使用“UPPER CASE”路径。正如我从您的代码中看到的那样,您将“cn”写为小写。 [GetGroups功能]
我尝试的另一种方法是确保您正在使用正在使用的“ connectionstring ”。
LDAP:// CN =“+ username +”,OU =“+ OU +”,OU = myOU,DC = myDC1,DC = myDC2“;
变为
LDAP:// orgname .ad.root / CN =“+ username +”,OU =“+ OU +”,OU = myOU,DC = myDC1,DC = myDC2“; < / p>
其中“ orgname ”是运行AD的服务器名称。
希望这有帮助。
答案 2 :(得分: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;
这对我有用。