Соответствие текущего пользователя с ActiveDirectory DirectoryEntry - PullRequest
0 голосов
/ 29 апреля 2020

Мой сценарий:

A клиентское приложение (Net Core WPF) должно каким-то образом выяснить личность текущего пользователя (например, с помощью System.Security.Principal.WindowsIdentity.GetCurrent()) и аутентифицироваться с серверное приложение REST (Net Core) , которое имеет доступ к AD (оно знает адрес, имя и пароль root AD DirectoryEntry). Аутентификация должна быть успешной, если и только если пользователь из клиентского приложения найден среди пользователей в AD . Это настройка anet между прочим.

Решения для подобных вопросов здесь, в SO (например, Как получить подробности Active Directory текущего пользователя в C#), как правило, предлагают использовать DirectorySearcher и фильтрация по имени пользователя "(sAMAccountName=theUserIWantToMatch)".

Но ИМХО этого недостаточно:

1) Это недостаточно безопасно, вы можете легко выдать себя за любого, просто создав пользователя с похожее имя. Не говоря уже о нападениях типа «человек посередине».

2) Это даже не должно быть злонамеренным, многие люди имеют схожие имена. Возможно, я подключился к сети intr anet через VPN, используя компьютер с аналогичным именем пользователя (похожим на кого-то другого, уже находящегося в этой сети).

Можете ли вы придумать лучший способ сопоставления пользователей ( используя какой-нибудь GUID или токен например) или совершенно другой метод аутентификации? Просто повторюсь: я не могу использовать обычный ASP. NET windows auth, потому что мой клиент - это приложение WPF, которое связывается с сервером с использованием экземпляра HttpClient.

Спасибо.

1 Ответ

1 голос
/ 29 апреля 2020

Безотказный способ получить точного пользователя, который вошел в систему, используя SID, который доступен из WindowsIdentity.GetCurrent().User.

Оттуда вы можете связать непосредственно с объект AD, использующий синтаксис привязки SID LDAP из LDAP://<SID=XXXXX>.

. Это будет выглядеть примерно так:

var sid = WindowsIdentity.GetCurrent().User;
var currentUser = new DirectoryEntry($"LDAP://<SID={sid}>");

Если компьютер, на котором вы работаете, это from не присоединяется к тому же домену, что и пользователь (или доверенный домен), тогда вам нужно будет включить имя домена в путь LDAP:

var currentUser = new DirectoryEntry($"LDAP://example.com/<SID={sid}>");

Этот метод также быстрее, чем любой другой метод, так как вы не выполняете поиск и затем привязку к объекту. Все это делается в одном сетевом запросе.

...