Как надежно проверить идентификатор домена Windows текущего пользователя на рабочей станции - PullRequest
4 голосов
/ 17 августа 2010

Я использую C # и .Net Framework 4.

Я ищу надежный способ получения идентификатора входа в систему текущего пользователя Windows, который не подвержен олицетворению или взлому.Я ищу это в виде: DOMAINNAME \ USERNAME

например, SOMEDOMAIN \ JohnDoe

В настоящее время лучшее, что у меня есть:

var identity = System.Security.Principal.WindowsIdentity.GetCurrent();
var currentLoginId = identity.Name;

Это открыто для олицетворения(если кто-то знает имя пользователя и пароль), и если да, то есть ли лучший способ сделать это?

Ответы [ 2 ]

4 голосов
/ 17 августа 2010

На этом этапе может быть задействовано как минимум четыре разных идентификатора:

  1. Идентификатор, назначенный потоку
  2. Идентификатор, присвоенный процессу
  3. учетная запись пользователя, который запустил процесс
  4. учетная запись пользователя, который вошел в систему ПК

В вашем коде вы получаете (1).Обычно это нормально и обычно совпадает с (2).

Чтобы получить (2), вы можете:

  1. Позвонить WindowsIdentity.GetCurrent, чтобы получить олицетворенную личность
  2. Отмените олицетворение, вызвав функцию Win32 RevertToSelf
  3. Посмотрите на WindowsIdentity.GetCurrent, чтобы получить базовый идентификатор процесса
  4. Сбросить идентификацию потока путем олицетворенияидентификатор из шага (1)

(2) и (3) будет одинаковым, если вы не написали неуправляемый код, который изменяет идентификацию процесса.Как указывает @Daniel, (3) и (4) могут на законных основаниях отличаться при наличии команды Windows «Запуск от имени».

Редактировать: Вы можете доверять этомутекущий WindowsIdentity - это тот, о ком он говорит, поскольку вы можете доверять любому фрагменту данных в вашем приложении.

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

100% безопасный способ сделать это - использовать встроенную аутентификацию/ SSPI для подключения к базе данных.

1 голос
/ 17 августа 2010

Только частичный ответ:

Я полагаю, System.Security.Principal.WindowsIdentity.GetCurrent(); вернет учетную запись пользователя Windows, связанную с текущим выполняющимся потоком.Если поток или приложение было запущено под другой учетной записью пользователя, не вошедшего в систему, вы не получите то, что используете после этого.

Если вы можете быть уверены, что вашПрикладная программа не была запущена с использованием функции «запуск от имени» (или программной эквивалентности), и вы ничего не делаете внутренне в отношении идентификации потока, вы можете быть уверены, что это вошедшая в систему учетная запись пользователя, но я не% по этому.

Может быть возможно найти учетную запись пользователя, связанную с "сеансом" вдов, в котором приложение выполняется с использованием ADSI (см. System.DirectoryServices).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...