Как аутентифицировать LDAP в .NET

Я хотел бы аутентифицировать имя пользователя и пароли для моего приложения в операционной системе Windows с любой службой каталогов. Например, это может быть активный каталог Microsoft, Novell eDirecotry или SunOne. Я уже знаю, как сделать этот код изначально для Microsoft Active Direcotry с помощью c #. (Я полностью отказался от использования ADSI и создания низкоуровневого ком-компонента)

Я пытаюсь пройти аутентификацию с помощью Novel eDirecotory: я установил проект Mono. Внутри монопроекта они предоставляют Novell.Directory.ldap.dll. Код выглядит примерно так же, как для Microsoft Active Directory. ( http://www.novell.com/coolsolutions/feature/11204.html )

Для SunOne мне сказали использовать тот же код, что и для активной директории, но строка подключения ldap немного отличается. ( http://forums.asp.net/t/354314.aspx ) ( http://technet.microsoft.com/en-us/library/cc720649. ASPX )

Чтобы усложнить мой проект, большинство клиентов используют «Сервисную учетную запись:», что означает, что мне нужно привязать административное имя пользователя и пароль, прежде чем я смогу аутентифицировать обычное имя пользователя и пароль. Мои вопросы в 2 частях.

1) Исходя из того, что я объяснил выше, это правильное направление, которое я должен собираться аутентифицировать в каждой отдельной директивной службе?

2) Я чувствую, что мне вообще не нужно ничего делать с этим кодом. Я также чувствую, что условия использования сервисной учетной записи не важны вообще. Если все, что меня волнует, это аутентификация имени пользователя и пароля на компьютере с Windows, зачем мне вообще использовать ldap? Я имею в виду, подумайте об этом. Когда вы заходите на свой компьютер утром, вам не нужно предоставлять служебную учетную запись только для входа в систему. Я могу легко аутентифицировать имя пользователя и пароль в командной строке DOS, используя функцию runas, и мне будет отказано или нет, и я смогу проанализировать текстовый файл. Я уверен, что есть другие способы, которыми я мог бы передать имя пользователя и пароль операционной системе Windows, в которой я нахожусь, и скажет мне, действительны ли имя пользователя и пароль для домена, в котором он включен. Я прав? Если да, то какие у вас есть предложения?

Михаил Эванчик www.MikeEvanchik.com

12 голосов | спросил Michael Rudner Evanchik 20 PMpMon, 20 Apr 2009 21:23:29 +040023Monday 2009, 21:23:29

3 ответа


0

Все это можно сделать с помощью System.DirectoryServices.Protocols. Если вы создадите LdapConnection для каталога, вы можете использовать учетную запись службы для привязки, а затем выполнить последующую привязку для проверки подлинности учетных данных.

Учетная запись службы обычно используется для ограничения доступа к механизму аутентификации сервера. Таким образом, ни один случайный человек на улице не может попытаться авторизоваться на вашем сервере LDAP.

Кроме того, ожидаете ли вы, что каждый пользователь предоставит свое отличительное имя при входе в систему? В Active Directory требуется только имя sAMAccountName, а для других поставщиков, таких как eDirectory и SunONE, для аутентификации требуется различающееся имя.

Чтобы выполнить аутентификацию такого типа, вам потребуется использовать служебную учетную запись, которая предоставляется для аутентификации на сервере, выполнить поиск пользователя с заданным именем пользователя и получить отличительное имя пользователя. Затем вы можете выполнить аутентификацию, используя это отличительное имя и пароль, которые были предоставлены.

Это будет работать для всех систем LDAP, за исключением Active Directory, которая будет довольна только именем sAMAccountName.

ответил Jared 7 Maypm09 2009, 23:54:19
0

Я не уверен, что полностью понимаю вопрос, но в некоторых ситуациях мне было легко аутентифицировать пользователя, просто выполнив поиск его учетной записи и используя его учетные данные в качестве имени пользователя и пароля.

Успешный запрос означает, что все предоставлено правильно, отсутствие поиска означает, что что-то не так.

//use the users credentials for the query
DirectoryEntry root = new DirectoryEntry(
    "LDAP://dc=domain,dc=com", 
    loginUser, 
    loginPassword
    );

//query for the username provided
DirectorySearcher searcher = new DirectorySearcher(
    root, 
    "(sAMAccountName=" + loginUser + ")"
    );    

//a success means the password was right
bool success = false; 
try {
    searcher.FindOne();
    success = true;
}
catch {
    success = false;
}

Возможно, это не "лучшая практика", но вы можете обойти вашу проблему ...

ответил Hugoware 20 PMpMon, 20 Apr 2009 21:36:56 +040036Monday 2009, 21:36:56
0

У нас был веб-сайт, на котором требовалась аутентификация имени пользователя и пароля по учетным данным домена, и мы использовали функцию API LogonUser. Используйте его для входа в сеть (один из аргументов - тип входа), и все, что он делает, это проверяет учетные данные, он не выполняет такие вещи, как загрузка профиля пользователя, как это делает runas. Единственное предостережение заключается в том, что учетной записи службы требуется достаточный доступ для вызова LogonUser. Я предлагаю вам проверить документацию MSDN, чтобы узнать, что это за доступ, потому что он зависит от ОС.

ответил pipTheGeek 20 PMpMon, 20 Apr 2009 21:54:05 +040054Monday 2009, 21:54:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132