LDAP と AD について、基本的な機能 (この場合は Microsoft) 以外はほとんど何も知らないにもかかわらず、ユーザーの電子メール アドレスを取得するようにプログラムを変更するように依頼されました。LDAP を使用するようにアプリケーションを構成できます。それがどのように使用されているのか正確にはわかりません-アプリケーションのパスワードをユーザーの LDAP パスワードと同期させることと関係があります。アプリケーションにはパスワードがありますが、これはユーザーの LDAP パスワードとは異なる場合があります。パスワードを同期するメカニズムがいくつかありますが、理論上は気にする必要はありませんが、機能すると言われています。
もちろん、試してみるための LDAP サーバーはここにはありませんでした。
そのため、私は Windows 2003 サーバーを PC にインストールし、LDAP を有効にしました (膨大な学習曲線です)。数人のユーザーを追加しました。そしてそのうちの 1 つを Domain Admin のメンバーにすることさえできました。
私が取り組んでいるアプリケーションには、LDAP への接続を構成するセットアップ機能があります。これには便利なテスト設定ボタンがあります。サーバーの IP アドレスとポート番号を入力して [設定のテスト] を押すと、テストが成功したことがわかります。うーん - それはありそうもないようです。それが求める他の情報があります:
- サービス アカウント DN
- サービス アカウントのパスワード
- ユーザー アカウント コンテナー。
これらを空白のままにして設定を保存すると、アプリケーションを起動して、ユーザー名のみをパスワード付きまたはパスワードなしで入力できるようになります。もちろん、これは正しくありません。アプリを起動できないはずです。したがって、これら 3 つの情報を設定する必要があるとしか考えられません。
私が作成した LDAP サーバーの名前は、Aware.Server
そのDC=AWare, DC=Server
ため、サービス アカウント DN (ここでは推測であり、そこに何があるべきかcn=Users, DC=AWare.Server
はよくわかりません) とユーザー アカウント コンテナー (繰り返しますが、それが何であるか、または何を意味するのかはよくわかりません) に入れました。そこにいる)。
サービス アカウントのパスワードがわからないので、空白のままにします。
Test Settings を押すと、ユーザー名とパスワードの入力を求められます。
それらを空白のままにすると、テストが成功したと表示されます。私は心配し始めています。
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