Я пытаюсь использовать Windows Identity Foundation для авторизации в приложении WPF client/server (WCF), которое может запускаться или не запускаться в той же среде доверия, что и активный каталог, предоставляющий аутентификацию. Например, аутентификация может предоставляться активным каталогом, но приложение может работать в облаке, а роли/разрешения пользователя для профиля будут предоставляться базой данных приложения.Как аутентифицировать экземпляр WindowsIdentity?
Я чувствую, что не хватает основополагающую часть процесса WIF в моей голове для того, чтобы полностью понять, что я должен делать:
- журналов пользователей в домене Windows, используя имя пользователя Active Directory/Пароль
- Пользователь открывает мое приложение.
- Я ссылаюсь на WindowsIdentity зарегистрированного пользователя и теперь могу посмотреть их токен входа и все их настроенные роли/заявки - но так же, как они могут войти в домен, они могут войти в свою собственную машину и все равно иметь Идентификатор WindowsIdentity.
- Я могу связать идентификатор пользователя Windows с их профилем пользователя в своей базе данных и предоставить им доступ к определенным функциям моего приложения, которые их профиль позволяет им.
Кусок, который мне не хватает, заключается в том, что у меня есть экземпляр WindowsIdentity из WindowsIdentity.GetCurrent() ... как я могу проверить, что сгенерировало это? то есть он является пользователем локальной машины или пользователем активного каталога, и если это активный пользователь каталога, откуда я знаю, что это мой bona fide active directory server?
Например - несколько сценариев:
Сценарий 1
- имена пользователей их локальный компьютер с таким же именем, как мой активной области каталога
- Пользователь создает локального пользователя на этом компьютере с тем же именем пользователя, что и у пользователя, которого он знает, в моем активном каталоге, который имеет полный административный доступ к моему приложению.
- Они входят в мое приложение и для всех интенсивных целей они имеют одинаковое имя пользователя, как если бы административный пользователь вошел в мой активный каталог.
В этом случае у пользователя есть локальная учетная запись пользователя, а не активная учетная запись каталога, и она имеет поддельное удостоверение, созданное для целенаправленной защиты приложения.
Я предполагаю, что есть какой-то способ определить, что это учетная запись локального пользователя Windows, а не пользователя Active Directory? Я мог бы позвонить в мой активный каталог для учетной записи пользователя с именем пользователя, найденным в WindowsIdentity, и сравнить идентификаторы SID, чтобы определить, что на самом деле это поддельная учетная запись пользователя, и пользователю должен быть отказано в доступе.
Это правильный способ сделать это? Есть ли какой-то способ, который я могу сказать из WindowsIdentity, что он был выпущен моим активным каталогом и что это удостоверение не было подделано?
Сценарий 2
- Пользователь создает поддельный сервер Active Directory с таким же именем, как моя активной директория и создает учетную запись, имитирующую тот же процесс, как локальный пользователь описанную в сценарии 1.
Теперь у меня есть активный пользователь каталога с тем же именем домена и именем пользователя, то же решение, которое я предложил для сценария 1, также решит проблему для этого сценария, но было бы неплохо определить, что этот токен не был создан моим активным директором y, просто изучив токен.
Может кто-то прояснить, что мне не хватает - или я вообще ничего не пропустил? Должен ли я просто позвонить в Active Directory для проверки подлинности, предоставляемой службой WindowsIdentity, доступ к моему приложению?
Проблема заключается в том, что мое приложение не находится внутри активного каталога domain - как мое приложение знает, что пользователь действительно является пользователем этого домена активного каталога, а не только каким-либо поддельным пользователем? – BobTheBuilder
Я расширил свой ответ, надеясь, что он ответит на ваш вопрос. В конкретном случае я почти уверен, что ваше приложение не является частью домена, тогда пользователю необходимо пройти аутентификацию с помощью локального пользователя. Если добавление пользователей домена не в домене возможно, ваш компьютер будет иметь учетные данные контроллера домена, а контроллер домена - это тот, который аутентифицирует пользователя. –
* «Ошибки и уязвимости в стороне вы можете быть уверены, что при вызове WindowsIdentity.GetCurrent() существует целая цепочка тяги, поддерживаемая разными учетными данными для аутентификации пользователя». * Это также относится и к другим экземплярам «WindowsIdentity» (например, например, тот, который вы можете получить из «Thread.CurrentPrincipal.Identity», если он был настроен на экземпляр «WindowsIdentity»), если их 'IsAuthenticated' является' true'? (Это суть [моего вопроса здесь] (http://stackoverflow.com/questions/33563758), который в настоящее время просто имеет ответ, который ... неубедителен, но касается.) –