2

ユーザーが存在することを認証した後、LDAP を使用して AD からユーザーの詳細を返すのに苦労しています。次のように単純な認証方法を使用しています。

Function AuthenticateUser(path As String, user As String, pass As String) As Boolean
    Dim de As New DirectoryEntry(path, user, pass, AuthenticationTypes.Secure)
    Try
        Dim ds As DirectorySearcher = New DirectorySearcher(de)
        Dim result As SearchResult = ds.FindOne()

        If result Is Nothing Then Return False


'>>DEBUG OUTPUTS ONLY:
        displayName.Text = result.GetDirectoryEntry().Properties.Item("distinguishedName").Value
        displayName.Text += result.GetDirectoryEntry().Properties("name").Value


        Return True
    Catch
        Return False
    End Try
End Function

問題は、「distinguishedName」が「DC=our-domain,DC=co,DC=uk」を返し、「name」が認証されたばかりのユーザーの名前ではなく、「our-domain」のみを返すことです。

注: displayName.text の出力は純粋にデバッグ用です。

さまざまなリクエストの組み合わせを試しましたが、ユーザーの詳細が返されないようです。

ETA: セキュリティ警察へ: これはすべて https 接続内で行われます。パスワードをプレーン テキストで送信するつもりはありません。

4

1 に答える 1

2
1. Dim de As New DirectoryEntry(path, user, pass, AuthenticationTypes.Secure)
2. Try
3.    Dim ds As DirectorySearcher = New DirectorySearcher(de)
4.    Dim result As SearchResult = ds.FindOne()

1 行目は基本的DirectoryEntryに、 のオブジェクトを参照する要素を作成していますpathusernameおよびpasswordパラメータが提供する唯一の目的は、エンティティが参照するものへのアクセスを許可pathすることです。

現在のものがあるので、ユーザーではなくドメインにバインドしています(ただし、そのユーザーとしてドメインに接続することは承認されています)。

次に、3 行目でDirectorySearcher. ただし、使用しているコンストラクターは、検索のルートを指定しているだけですde(確立したように、これは単なるドメインです)。ドメイン内でその特定のユーザーを検索するためにまだ何もしていません。考えられるほぼすべての種類の検索を実行するために接続している可能性があります。

あなたがやりたいことは、フィルターパラメーターを受け入れるDirectorySearcher のオーバーロードを見て、検索をユーザーだけに制限するフィルターパラメーターを提供することです。パラメータの形式がわかりませんuser。たとえば、ユーザー プリンシパル名 ( user@domain) の形式である場合は、次のフィルタを指定してみてください。

Dim ds As DirectorySearcher = New DirectorySearcher(de,"(userPrincipalName=" + user + ")")

ユーザー名しかない場合は、 に対して検索しsAMAccountNameます。古いスタイルのドメイン名 ( domain\user) を使用している場合、通常は で分割し\、ドメイン名を破棄して、 で検索しsAMAccountNameます。

フィルター パラメーターの作成に関するヘルプは、Filterプロパティ ドキュメントにあります。

于 2012-05-31T10:03:54.770 に答える