jlzhou

回复才有动力~~
posts - 24, comments - 148, trackbacks - 1, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

VB.NET LDAP 用户身份验证

Posted on 2005-06-26 22:47 jlzhou 阅读(3084) 评论(5)  编辑 收藏 所属分类: 编程技术区
前几天花了两天时间研究如何在.NET下验证LDAP的用户身份,看了一些java和vb的代码,碰了不少钉子,试验再试验,终于搞定,与大家分享...

首先,我要讲的LDAP不是微软的Active Directory目录服务,而是运行在SUN One上面的目录服务。

请看代码(部分敏感信息删节):

    Private Sub btnTest_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btnTest.Click
        
Dim LoginName As String = txtUser.Text
        
Dim LoginPwd As String = txtPwd.Text
        
If LoginPwd = "" Then
            txtResult.Text 
= "* Password can not be blank."
            Exit Sub
        
End If
        
Dim myDirectorySearcher As DirectorySearcher
        
Dim mySearchResult As SearchResult
        
Dim myDirectoryEntry As DirectoryEntry
        
Dim UserName As String
        txtResult.Text 
= ""
        Try
            
If myDirectoryEntry.Exists("LDAP://ldapserver.com/uid=" & LoginName & ",ou=people,ou=intranet,dc=yourdomainname,dc=com"Then
                
Try
                    myDirectoryEntry 
= New DirectoryEntry("LDAP://ldapserver.com/ou=people,ou=intranet,dc=yourdomainname,dc=com""uid=" & LoginName & ",ou=people,ou=intranet,dc=yourdomainname,dc=com", LoginPwd, AuthenticationTypes.ServerBind)
                    myDirectorySearcher 
= New DirectorySearcher(myDirectoryEntry)
                    myDirectorySearcher.
Filter = "(uid=" & txtUser.Text & ")"
                    myDirectorySearcher.PropertiesToLoad.Add("DisplayLastName")
                    myDirectorySearcher.PropertiesToLoad.Add(
"DisplayFirstName")
                    mySearchResult 
= myDirectorySearcher.FindOne
                    
If mySearchResult Is Nothing Then
                        txtResult.Text 
+= "* Login failed."
                    Else
                        txtResult.Text 
+= ">>> Login passed!" & vbCrLf
                        UserName 
= mySearchResult.GetDirectoryEntry().Properties("DisplayFirstName").Value & " " & mySearchResult.GetDirectoryEntry().Properties("DisplayLastName").Value
                        txtResult.Text 
+= UserName & vbCrLf
                        
                    
End If
                
Catch ex As Exception
                    txtResult.Text 
+= "* Login failed." & vbCrLf & ex.Message
                
End Try
            
Else
                txtResult.Text 
+= "* Invalid user login name."
            End If
        
Catch ex As Exception
            txtResult.Text 
+= "* Can not access the LDAP server." & vbCrLf & ex.Message
            
        
End Try
    
End Sub

这里要说明一下:

1、必须检验密码不能为空,否则会造成验证有误,即空密码能通过验证,不知道为什么。
2、LDAP://......这最前面的四个字母LDAP必须大写!否则报未知错误,不知道为什么,还得我走了一段弯路。
3、ldapserver.com需要替换成LDAP服务器的地址。
4、LDAP://......地址后面的参数,要根据你要访问的LDAP的设置而定。
5、如果密码不对,会引发异常,所以我在异常处理中捕获,但是不知道这样是否正确。
6、If mySearchResult Is Nothing Then 这句我觉得是废话,好像怎么也不会为True,如果密码不对,会引发异常的,但是不放心还是加上这句,可能是我的判断逻辑有问题。

总之,这段代码肯定不是最完美的代码,但是确实是可以完成任务的代码,欢迎大家指正。

Feedback

#1楼    回复  引用  查看    

2005-06-28 13:21 by 天行者      
用NativeObject一句就可以搞定了,做成一个公共函数,封装在一个独立的NameSpace中,方便其他人使用,空值放到客户端去验证:
Shared Function chkUser(ByVal uid As String, ByVal pwd As String) As Boolean
Try
Dim entry As New DirectoryEntry("LDAP://ldapserver.com", "uid="+uid+",ou=People,dc=yourdomainname,dc=com", pwd, AuthenticationTypes.ServerBind)

Dim x As Object = entry.NativeObject

Return True
Catch ex As Exception
Throw ex
End Try
End Function

#2楼    回复  引用    

2006-06-21 15:48 by jin.t [未注册用户]
你好,请问这个LDAP的目录访问怎么弄啊?能不能给解释一吓.

#3楼    回复  引用    

2006-06-21 15:49 by jin.t [未注册用户]
以下目录服务配置参数:
hostname=110.167.100.211
port=676
basedn=o\=lspc,o\=silspc
binddn=cn\=Directory Manager
bindpassword=abcde123

#4楼    回复  引用    

2006-09-11 17:20 by niko [未注册用户]
VB.NET LDAP 如何修改用户资料?如果我想修改密码应该怎么作啊?

#5楼    回复  引用    

2006-10-13 11:01 by kitten [未注册用户]
为什么登录是空密码可以,一旦密码不为空,就难证出错?

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: