1

C# を使用して OpenLDAP に接続しています。ユーザー名とパスワードを渡すときは、それらを cn=Username, Password として LdapConnection オブジェクトに渡す必要があります。ユーザー名とパスワードを渡すだけでは、Bind の呼び出しが失敗します。なぜ私はそれをしなければならないのですか?OpenLDAP サーバーで何かが正しく構成されていませんか?

4

1 に答える 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 に答える