0

他の人がこれをどのようにコーディングしているかに興味があります。なぜなら、私はそれを正しく理解していないか、何かが欠けているか、あるいはおそらく私が正しくやっているからです!

まず第一に、これは LDAP の Active Directory インスタンスではありません。その OpenDS は、いくつかの構文上の違いを除けば、それほど重要ではありません。

したがって、ツリー構造を次のように設定しているとします。

-dc=somedomain,dc=com
-uid=rootuser
    -ou=Group1
       -uid=username1
       -uid=username2
    -ou=Group2
       -uid=username3
       -uid=username4

「rootuser」として認証するには、System.DirectoryServices.DirectoryEntry オブジェクトを作成するときに完全修飾ユーザー名を渡す必要があります。この場合:

uid=rootuser,dc=何らかのドメイン,dc=com

ただし、ツリー内の他のユーザーについては、認証を受けるためにユーザー名に追加する LDAP パスを事前に知っておく必要があります。たとえば、これは失敗します。

uid=username1,dc=何らかのドメイン,dc=com

しかし、これはうまくいきます:

uid=username1,dc=somedomain,dc=com,ou=Group1

だから私の質問は、ログイン時にユーザーがそのパスを構築するために属している特定のグループがわからない場合、これをどのように処理するのですか? 私がそれを行うことができる唯一の方法は、最初の呼び出しを「rootuser」として行うことです。これにより、ツリー全体にアクセスできるようになり、System.DirectoryServices.DirectorySearcher を使用してその特定のユーザー (つまり、username1) をスキャンします。

using (DirectorySearcher searcher = GetDirectorySearcher()) {
    searcher.Filter = "(&(objectClass=person)(uid=" + userName+ "))";
    SearchResult result = searcher.FindOne();
    return result.GetDirectoryEntry().Path;
}

その時点で、ログインしたいユーザーのパスがあり、実際の認証に進むことができます。私はここでベースから離れていますか、それともこれは一般的にどのように行われますか?

ありがとう!

4

2 に答える 2

0

ユーザーに固有の属性 (スクリーン名、電子メールなど) で検索フィルターを作成します。LDAP が一意であることを確認するように構成されていることを確認してください。次に、対応するエントリがあれば見つけ、DN を取得し、適切なパスワードを使用してそのユーザーとして再バインドします。そのようなエントリがなかった場合は、それに応じて反応します。

使用している言語はわかりませんが、JNDI では、DN をセキュリティ プリンシパルとして設定し、パスワードを資格情報として設定し、LdapContext.reconnect() を呼び出すことを意味します。

于 2011-05-25T23:41:40.247 に答える
0

SASL は、認証にユーザー名を使用するという概念をサポートしています。ディレクトリ サーバー管理者は、識別名を ID にマップするようにディレクトリ サーバーを構成できる場合があります。正しいマッピングがあれば、クライアントは識別名を知らなくても認証できます。direct mappingプロ品質のディレクトリ サーバーは、 、exact matchregular expression、またはカスタム ID マッパーなど、さまざまなマッピング メカニズムをサポートしています。

于 2011-06-26T14:25:22.340 に答える