none
.net active directory 验证问题 RRS feed

  • 问题

  • 开发环境vs2010 vb模式 .net 网站. 用户名和密码验证通过ad数据库服务器.

    采用网上比较流行的ad验证代码

    Public Function Authed(ByVal username As String, ByVal pwd As String) As Boolean
            Dim entry As DirectoryEntry = New DirectoryEntry(_path, username, pwd)
            Dim obj As Object = entry.NativeObject
            Dim search As DirectorySearcher = New DirectorySearcher(entry)
            search.Filter = "(SAMAccountName=" & username & ")"
            Dim result As SearchResult = search.FindOne()
            If result Is Nothing Then
                Return False 'ad验证失败
            Else
                Return True 'ad验证通过
            End If
                End Function

    现在的问题是.如果用户输入的用户名和密码是正确的.logon页面中提示通过验证.没有问题.一切正常.

    但是如果输入的用户名和密码是错误的,却得不到"用户名or密码错误的提示"(logon页面程序设定验证不通过时候的提示).调试程序,显示Dim obj As Object = entry.NativeObject出错.如图

    是什么问题?iis中已经设定了允许匿名访问。用户不是默认的iusr_computername.而是用的域用户。

    web.config中

    <authentication mode="Forms">
          <forms name="hd" loginUrl="logon.aspx" timeout="30" path="/"/>
        </authentication>
        <authorization>
          <deny users="?"/>
          <allow users="*"/>
        </authorization>
        <identity impersonate="true "/>


    nn

    2013年2月28日 3:56

答案

  • 经过各种研究,发现问题在于Dim obj As Object = entry.NativeObject这个语句已经对用户输入的用户名和密码做.NativeObject属性绑定adsobject。如果输入的用户名和密码是正确的,则adsobject绑定成功。可以通过这个语句程序继续往下走,如果用户输入的用户名或者密码是错误的,则在这一步就不能通过。所以导致错误。程序不会往下继续执行。也不会判断什么返回result Is Nothing返回什么false状态了。

    这是我个人测试出来的结果和理解。不知道对不对。如果我的推断是正确的。那么,不明白网上的这个代码下面部分还有什么意义?绑定adsobject都通不过。还怎么去判断result Is Nothing???

    原本看到这段代码,理解为是先链接ldap的ad账户。然后在ad库里面寻找用户输入的用户名和密码看是不是匹配。经过测试看来其实不是。而是直接用用户输入的用户名和密码链接ad库进行绑定adsobject,如果用户名密码正确。绑定ok。如果不正确,直接绑定失败。所以根本不用后续代码来判断什么result Is Nothing了。

    网上所找原来代码:

    Public Function Authed(ByVal username As String, ByVal pwd As String) As Boolean
           
    Dim entry As DirectoryEntry = New DirectoryEntry(_path, username, pwd)
           
    Dim obj As Object = entry.NativeObject
           
    Dim search As DirectorySearcher = New DirectorySearcher(entry)
            search
    .Filter = "(SAMAccountName=" & username & ")"
           
    Dim result As SearchResult = search.FindOne()
           
    If result Is Nothing Then
               
    Return False 'ad验证失败
           
    Else
               
    Return True 'ad验证通过
           
    End If
               
    End Function

    改为:

    Public Function Authed(ByVal username As String, ByVal pwd As String) As Boolean
           
    Dim entry As DirectoryEntry = New DirectoryEntry(_path, username, pwd)

    try
           
    Dim obj As Object = entry.NativeObject      ‘这里就开始用用户名和密码绑定了
           
    Return true'ad验证ok    

    catch ex as exception     ’如果绑定不成功导致出错了。说明输入的用户名或者密码不正确。直接返回验证失败
               
    Return false'ad验证失败
           
    End If
               
    End Function

    经过测试。在我的domain内成功。 分享下。


    nn

    2013年2月28日 6:28