Аутентификация пользователей с использованием Active Directory в клиент-серверном приложении - PullRequest
11 голосов
/ 27 августа 2009

Меня попросили предоставить поддержку для аутентификации пользователей по Active Directory в нашем существующем клиент-серверном приложении.

В данный момент пользователь вводит имя пользователя и пароль с клиентского компьютера, передается по сети (зашифровано) на наш серверный процесс и сопоставляется с именем пользователя / паролем, хранящимся в базе данных.

Изначально я думал, что это будет легко решить, поскольку я мог просто аутентифицировать имя пользователя и пароль в Active Directory из нашего серверного процесса. Однако оказывается, что пользователям не нужно вводить пароль из нашего клиентского приложения, а вместо этого принимать его учетные данные из текущего сеанса входа Windows .

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

Наш сервер написан на C ++, поэтому мы будем использовать win32 API . Я также намереваюсь разработать и отладить это с помощью виртуальной машины под управлением Windows 2008 AD LDS - надеюсь, этого будет достаточно для достижения моих целей.

Любая помощь или совет очень ценится.

1 Ответ

10 голосов
/ 27 августа 2009

Вы выполняете NTLM / Kerberos / Negotiate SSPI exchange loop . В MSDN имеется полный образец как для клиента , так и для сервера . Для ясности: вы не явно используете любой вид доступа LDAP. Является ли LSA (Local Security Authority), который взаимодействует с LDAP и устанавливает личность клиента. Если вы успешно выполнили весь цикл SSPI, аутентификация уже прошла успешно, и идентификация клиента alread аутентифицирована по LDAP. Если вашему серверу необходимо знать идентификационные данные клиента (например, чтобы узнать имя использования), он извлекает его из контекста безопасности, что привело к циклу SSPI с использованием QueryContextAttributes(..., SECPKG_ATTR_NAMES,...), и извлекает имя пользователя из SecPkgContext_Names структура.

...