Почему открытый OpenLDAP требует cn=username?

Я подключаюсь к OpenLDAP с помощью C#, и когда я передаю свое имя пользователя и пароль, я должен передать их в свой объект LdapConnection как cn=Username, Password. Если я просто передам имя пользователя и пароль, мой вызов Bind завершится ошибкой. Почему я должен это делать? Что-то неправильно настроено на моем сервере OpenLDAP?


person Jonathan Beerhalter    schedule 08.04.2013    source источник
comment
Префикс CN= является частью спецификации LDAP — это сокращение от Common Name — и нет, нет ничего неправильно настроенного — это просто способ, которым LDAP идентифицирует объекты (например, пользователей).   -  person marc_s    schedule 09.04.2013


Ответы (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