C# を使用して OpenLDAP に接続しています。ユーザー名とパスワードを渡すときは、それらを cn=Username, Password として LdapConnection オブジェクトに渡す必要があります。ユーザー名とパスワードを渡すだけでは、Bind の呼び出しが失敗します。なぜ私はそれをしなければならないのですか?OpenLDAP サーバーで何かが正しく構成されていませんか?
質問する
409 次
1 に答える
1
これは実装の副産物にすぎません。Novell の eDirectory ソリューションは非常によく似たアプローチを採用しており、同じNovell.Directory.Ldap
コードを使用して eDirectory と OpenLDAP の両方へのバインド要求を処理しています。明らかに、ユーザー自身が承認時に CN 全体を入力する必要はありません。ユーザーの UID に基づいて検索を実行するだけで済みます。
//Setup the initial bind for the admin user
var lc = new LdapConnection();
lc.SecureSocketLayer = SSL;
lc.UserDefinedServerCertValidationDelegate += delegate { return true; };
lc.Connect(ServerName, Port);
lc.Constraints.TimeLimit = Timeout;
lc.Bind(AdminUsername, AdminPassword);
ここで、ユーザーをフィルター処理し、識別名または完全なコンテナー名 (CN) を使用してバインドします。
//Ex. (uid=jsmith)
string filter = config.LdapAuth.LdapFilter.Replace("{{uid}}", username);
//Find the user we're trying to authorize
var lsc = lc.Search(config.LdapAuth.LdapDomain, LdapConnection.SCOPE_SUB, filter, null, false);
if (lsc.hasMore())
{
LdapEntry nextEntry = lsc.next();
//Check the Entries DN so we can properly bind
lc.Bind(nextEntry.DN, Password);
}
これは、私が見つけることができる最も広く使用されているアプローチであり、これまでのところ非常にうまく機能しています。
于 2013-04-08T21:20:38.647 に答える