Я подключаюсь к OpenLDAP с помощью C#, и когда я передаю свое имя пользователя и пароль, я должен передать их в свой объект LdapConnection как cn=Username, Password. Если я просто передам имя пользователя и пароль, мой вызов Bind завершится ошибкой. Почему я должен это делать? Что-то неправильно настроено на моем сервере OpenLDAP?
Почему открытый OpenLDAP требует cn=username?
Ответы (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);
}
Это был наиболее широко используемый подход, который я смог найти, и до сих пор он работал достаточно хорошо.
person
X3074861X
schedule
08.04.2013
CN=
является частью спецификации LDAP — это сокращение от Common Name — и нет, нет ничего неправильно настроенного — это просто способ, которым LDAP идентифицирует объекты (например, пользователей). - person marc_s   schedule 09.04.2013