使用LDAP / AD控制对程序的访问 - 帐户密码是什么?

时间:2013-04-03 08:42:04

标签: authentication active-directory passwords ldap

尽管我对LDAP和AD几乎一无所知,除了它的基本知识(在这种情况下,微软),我被要求修改一个程序,以便它将检索用户的电子邮件地址。可以将应用程序配置为使用LDAP。我不确定它是如何使用它的 - 与应用程序的密码与用户的LDAP密码同步有关。应用程序有一个密码,可能与用户的LDAP密码不同。有一些同步密码的机制 - 但理论上我不应该关注 - 我被告知它有效。

当然,我们这里没有LDAP服务器供我试用。

所以我在PC上安装了Windows 2003服务器,并在其上启用了LDAP(我可以告诉你一个巨大的学习曲线)。我添加了几个用户。甚至设法让其中一人成为Domain Admin的成员。

在我正在处理的应用程序中,有一个设置工具来配置与LDAP的连接。这有一个有用的测试设置按钮。如果我输入服务器IP地址和端口号,然后按“测试设置”,它会告诉我测试成功。嗯 - 这似乎不太可能。它要求提供其他信息:

  • 服务帐户DN
  • 服务帐户密码
  • 用户帐户容器。

如果我将这些留空,并保存设置,那么我现在可以启动应用程序,只使用任何密码或没有密码的用户名 - 这当然是不对的 - 它应该阻止我启动我的应用。所以我只能假设我需要设置这三个信息。

我认为我创建的LDAP服务器是Aware.Server

所以我已将DC=AWare, DC=Server放入服务帐户DN(我只是在这里猜测,不确定应该在那里)和cn=Users, DC=AWare.Server到用户帐户容器中(再次,我不要我真的知道那是什么,或者意味着在那里。

我不知道服务帐户密码是什么,所以我把它留空了。

当我按下测试设置时,它会要求我输入用户名和密码。

如果我留下那些空白,那么它说测试成功了。我开始担心了。

如果我输入我输入LDAP的用户名,并输入密码,则表示测试成功。

实际上,如果我在这些方框中放置任何东西,它就说它是成功的。

但是,如果我在服务帐户密码中添加了某些内容,那么测试就不会成功 - 它表示所提供的服务帐户具有无效的用户名或密码。

所以此时的主要问题是 - 如何找出服务帐户密码是什么?

我的预期行为是什么? 谢谢 史蒂夫

验证登录的代码包括:

Public Shared Function ValidateUser(ByVal server As String, ByVal port As Integer, ByVal userBase As String, ByVal userName As String, ByVal password As String, ByVal bindUser As String, ByVal bindPassword As String) As LdapValidatorResult
            Dim retVal As New LdapValidatorResult
            Dim conn As New Novell.Directory.Ldap.LdapConnection()
            Try

                'connect to the specificed server for user validation
                conn.Connect(server, port)

                retVal.Result = LdapValidatorResultType.Success
                Try
                    'now authenticate to we can then go on to see if the username specificed exists
                    conn.Bind(bindUser, bindPassword)

                    'construct the distinguished name to uniquely id the specified user
                    Dim searchString As String = String.Format("CN={0},{1}", userName, userBase)

                    'look to see if the user attempting to login to a-ware exists
                    Dim sResults As LdapSearchResults = conn.Search(searchString, Novell.Directory.Ldap.LdapConnection.SCOPE_SUB, Nothing, Nothing, False) '"(&(!(objectClass=computer)))"
                    If sResults.hasMore Then

                        Try

                            'now validate the user with the password as the final check
                            Dim userDN As String = sResults.next.DN
                            conn.Bind(userDN, password)
                            retVal.Result = LdapValidatorResultType.Success

                        Catch ex As Novell.Directory.Ldap.LdapException
                            If ex.ResultCode = Novell.Directory.Ldap.LdapException.INVALID_CREDENTIALS Then
                                retVal.Result = LdapValidatorResultType.InvalidUserNameOrPassword
                            End If
                            retVal.ExceptInfo = ex
                        End Try

                    Else
                        retVal.Result = LdapValidatorResultType.NonExistentUser


                    End If
                Catch ex As Novell.Directory.Ldap.LdapException
                    Select Case ex.ResultCode
                        Case Novell.Directory.Ldap.LdapException.INVALID_CREDENTIALS
                            retVal.Result = LdapValidatorResultType.InvalidBindUserNameOrPassword
                        Case Novell.Directory.Ldap.LdapException.CONNECT_ERROR
                            retVal.Result = LdapValidatorResultType.ServerDown
                    End Select

                    retVal.ExceptInfo = ex
                End Try

            Catch ex As Novell.Directory.Ldap.LdapException
                Dim cause As System.Net.Sockets.SocketException = TryCast(ex.Cause, System.Net.Sockets.SocketException)
                If cause IsNot Nothing Then
                    Select Case cause.ErrorCode
                        Case 1101
                            retVal.Result = LdapValidatorResultType.InvalidNameIp
                        Case 1106
                            retVal.Result = LdapValidatorResultType.RefusedConnectionOnPort
                        Case 10060
                            retVal.Result = LdapValidatorResultType.ServerDown
                    End Select
                End If
                retVal.ExceptInfo = ex
            End Try

            Return retVal
        End Function

1 个答案:

答案 0 :(得分:0)

看起来它希望您在域中创建用户帐户以供应用使用。每个对象都有一个可分辨的名称(DN)。所以它要求你创建的用户的DN和密码,以及你创建用户的容器的DN。我不知道你的域名是什么,但我猜它是AWare。服务器。因此,如果您使用密码为P @ ssw0rd的默认用户容器中创建名为appuser的用户,那么您将提供以下内容:

服务帐户DN:CN = appuser,CN = Users,DC = AWare,DC = Server 服务帐户密码:P @ ssw0rd 用户帐户容器:CN = Users,DC = AWare,DC = Server