Как передать учетные данные пользователя из одного процесса в другой для олицетворения в .NET 1.1? - PullRequest
0 голосов
/ 22 июня 2010

У меня есть служба Windows (написанная на .NET 1.1), работающая под определенной учетной записью пользователя, а экземпляры службы работают на нескольких серверах.

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

Лучше ли передать имя пользователя, домен и пароль, чтобы служба Windows выполняла олицетворение? Я не вижу, как сериализовать WindowsIdentity и передать его в качестве параметра для службы, а затем выполнить Impersonate () и Undo () для ввода-вывода.

Как объект-контейнер, System.Net.NetworkCredential не помечен как сериализуемый, поэтому передача трех отдельных параметров представляется логичной. По сути, я использую процедуру олицетворения, найденную в KB306158 .

Ответы [ 3 ]

4 голосов
/ 31 января 2011

Краткий ответ: вообще не передавайте учетные данные.Такой подход небезопасен.

Вместо этого вы должны стремиться использовать механизм безопасности, предоставляемый ОС, для достижения того, что вы хотите сделать.Он называется SSPI (интерфейс поставщика поддержки безопасности).Используя это, процессы обмениваются серией токенов, сгенерированных поставщиком безопасности на уровне ОС, для настройки контекста безопасности без необходимости передачи учетных данных в коде режима пользователя.

Если вы смогли обновить свою службу доиспользовать .NET 3.5, вы могли бы использовать WCF для выполнения IPC, и, при соответствующей настройке, он позаботился бы о деталях рукопожатия SSPI и сразу же включил бы олицетворение.

Если вы застряли в .NET 1.1, затем взгляните на статьи и примеры кода, предоставленные здесь и здесь , которые показывают, как вызывать SSPI из управляемого кода и использовать его для защиты канала удаленного взаимодействия .NET.

1 голос
/ 24 июня 2010

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

Я бы взял упомянутый вами подход, если это возможно, и передал бы учетные данные для входа (user / pass) в службу и позволил бы им использовать их для олицетворения.

1 голос
/ 22 июня 2010

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

edit Вам потребуется настроить форму межпроцессного взаимодействия между вашим приложением winform и службами, работающими на отдельных компьютерах. Мои извинения Я думал, что это вопрос о том, как выдать себя за роль, а не о том, как отправить информацию в ваш процесс. Что касается методов для IPC, есть довольно много вариантов. Взгляните на этот сайт , он предоставит гораздо больше информации, чем я. Ваша лучшая ставка будет использовать именованные каналы.

[DllImport("advapi32.dll",EntryPoint = "LogonUser", SetLastError = true)]
    public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword,
    int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

IntPtr admin_token = IntPtr.Zero;
WindowsIdentity wid = WindowsIdentity.GetCurrent();
WindowsIdentity wid_admin;  
WindowsImpersonationContext wic;

if (LogonUser(user, servername, pass, 9, 0, ref admin_token))
{
    wid_admin = new WindowsIdentity(admin_token);
    wic = wid_admin.Impersonate();
    //do stuff with new creds here
}
...