2011-05-25 11 views
0

私はそれを正しく理解していないか、または何かが欠けているか、おそらく私が正しくやっているので、他の人々がこれをコードする方法に興味があります!LDAPによる認証

まず、LDAPのActive Directoryインスタンスではなく、構文上の違い以外にはあまり重要でないOpenDSインスタンスです。私は私のSystem.DirectoryServices.DirectoryEntryを作成するときに、私は、完全修飾ユーザー名を渡す必要があるだろう「rootuser」として認証するために

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

:だから私は、ツリー構造のセットアップにこのような何かを持っている

を想定この場合、オブジェクト、:

はuid = rootuser、DC = somedomain、dc = comの

が、ツリー内の他のユーザーのために私は、LDAPパスがそれらを持っているユーザ名に追加するかを事前に知っている必要がありますスルーします。したがって、たとえば、これは失敗します。

はuid = USERNAME1、DC = somedomain、dc = comの

が、これは動作します:

はuid = USERNAME1、DC = somedomain、dc = comの、OU =グループ1を

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

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

私はログインしたいユーザーのパスを持っており、実際の認証を進めることができます。私はここにベースオフか、これは一般的にどのように行われていますか?

ありがとうございました!

答えて

0

検索フィルタは、ユーザーに固有の属性(例:画面名、電子メール。 LDAPが固有であることを確認するようにLDAPが設定されていることを確認します。次に、対応するエントリがあればそれを見つけ、DNを取得し、適切なパスワードでそのユーザに再バインドします。そのようなエントリがない場合は、それに応じて反応します。

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

+0

System.DirectoryServicesは.NETフレームワークの一部です。申し訳ありませんが、それがはっきりしていない場合。あなたが言ったことに基づいて正しくやっているようです。そして、はい、uidはこのオブジェクトのユニークな識別子です。ありがとう – snappymcsnap

0

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