2012-02-21 2 views
2

Проще говоря: Могу ли я сгенерировать на C++ текстовую информацию - токен пользователя, токен доступа, токен доступа (?) - текущего пользователя Windows, а затем проверить эту текстовую информацию (аутентифицировать пользователя) где-то еще (другой компьютер в домене)?Ток аутентификации Windows C++

passing string token

У меня есть два компьютера. На первом пользователь должен иметь возможность подключаться через клиентское приложение к моему серверному приложению, работающему на втором компьютере. Он должен использовать проверку подлинности Windows, поэтому сервер будет использовать свои группы окон для получения какой-либо информации - без отправки имени пользователя и пароля. Моя идея (не знаю, возможно ли), что клиентский компьютер/процесс знает текущего пользователя, поэтому он получит токен доступа пользователя или что-то в этом роде, передаст это серверу (как параметр строки), сервер проверит, что эта токена-строка действительна и получит имя этого пользователя Windows и его группы для следующих операций, вот что мне нужно.

Возможно ли это только с одной информацией (этот токен доступа/токен доступа или как его называть), отправленный с клиента на сервер? (http-сервер, я просто хочу отправить этот токен строки один раз с одним запросом на вход, который в настоящее время используется для других проприетарных способов аутентификации, без установления связи/переговоров или чего-то подобного, если это возможно). Я использую C++.

В настоящее время я нашел два пути (вероятно, способы, как не делать;))

1) функция, как OpenProcessToken, GetTokenInformation - это дает мне доступ к маркеру доступ, но это просто ручки, и я могу использовать его, вероятно, только в моем процессе, невозможно отправить его в другое место ...

2) Такие функции, как AcquireCredentialsHandle, InitializeSecurityContext, AcceptSecurityContext - сегодня я провел много времени с этим - я сделал несколько тестовых приложений, используя эти функции, в одном процессе я в настоящее время не совсем уверен, как это должно быть сделано посредством «текстовой» связи между двумя компьютерами, но это не важно - кажется, что больше раундов должны быть сделаны - клиент создает что-то (контекст, учетные данные, токен, ...), отправляет его на сервер, сервер что-то делает, отвечает клиенту, клиент берет результат и т. д. Могу ли я это сделать, просто создав «сеанс токена "и отправки его (например, с именем домена @ username, если необходимо) без дополнительной информации, возвращающейся и снова?

Любая помощь приветствуется, спасибо!

EDIT: На основании первых комментариев ниже, мне кажется, это необходимо уточнить: Представьте, что пользователь работает с веб-браузером и подключается к моему серверному приложению в другом месте. Он хочет отправлять команды типа «CONNECT» и «DO_STUFF». Серверное приложение будет делать только в том случае, если этот пользователь может подключиться первым. Но этот пользователь может подключиться, например, только в том случае, если он является членом какой-либо группы окон (используется проверка подлинности Windows, а не некоторые патентованные пользователи и пароли). Таким образом, сервер должен проверить, является ли этот пользователь действительным членом этой группы. Но сервер может сделать это только на основе текстовой информации, предоставленной пользователем, конечно. Ну, пользователь может отправить свое имя пользователя и пароль для аутентификации по серверному приложению (должно выполняться с помощью функции C++ LogonUser или что-то еще), но это опасно, и я не хочу, чтобы пользователь вводил его имя пользователя и пароль где-то, я просто хочу, чтобы он «нажмите кнопку входа в систему», а C++ позаботится обо всем остальном, потому что он может проверить его текущие данные сеанса, он уже вошел в систему. Моя идея состоит в том, чтобы указать имя пользователя и какой-то токен пользовательской строки (токен сеанса, токен доступа, я не знаю точной терминологии), которая будет создана пользовательским клиентским приложением (с использованием Kerberos, NTLM, я не знаю), и сервер получит эту строковую информацию, он проверит этот токен, чтобы убедиться, что «это действительно токен действительного пользователя Windows, и вот группы, к которым он принадлежит »... что-то вроде этого. Надеюсь, это объяснение поможет.

+0

Я предполагаю, что вы размышляете Remote Desktop/RDP и это не сработало? – Widor

+0

Что вы понимаете, используя удаленный рабочий стол? Это написанное на C++ приложение, которое будет аутентифицировать пользователя на основе информации, предоставленной клиентским приложением на другом компьютере, где этот пользователь зарегистрирован. Мне нужно получить некоторую информацию из клиентского приложения, чтобы разрешить вход в серверное приложение (например, если пользователь находится в некоторые специальные группы окон, чтобы сделать их простыми). Я не хочу, чтобы отправить имя пользователя win и пароль, я хотел бы отправить win имя пользователя и выиграть токен. – user1173626

+0

ОК, это C#, но это похоже на то, что вы могли бы попробовать: http://stackoverflow.com/questions/288796/how-to-use-terminal-services-programmatically – Widor

ответ

3

Такие функции, как AcquireCredentialsHandle, InitializeSecurityContext, AcceptSecurityContext и другие подобные решения.

Проверить http://msdn.microsoft.com/en-us/library/ms973911.aspx#remsspi_topic3

Если вы хотите только для аутентификации пользователя, NTLM хорошо, но вам необходимо обмениваться несколько сообщений, это не может быть сделано только в одном шаге, как я требовал первоначально (необходимо: вести переговоры, вызов , ответ), поэтому вы отправляете фактически 3 текстовых сообщения и обрабатываете их с помощью упомянутых выше функций.

Если вы хотите делегировать (сервер может выступать в роли клиента - олицетворять - и даже делегировать права другому процессу), вам необходимо использовать Kerberos (требуется Active Directory). Все должно быть сделано в одном домене. Вероятно, этого можно добиться, отправив меньше сообщений от клиента на сервер на основе приведенного ниже изображения, потому что полномочия гораздо более активны, но я не тестировал этот сценарий.

NTLM and Kerberos handshake http://i.msdn.microsoft.com/dynimg/IC10253.gif

Смежные вопросы