Выдача себя за другое лицо с помощью Net .Security.NegotiateStream - PullRequest
0 голосов
/ 06 мая 2020

Документация MSDN для класса NegotiateStream говорит:

Используя NegotiateStream, вы можете сделать следующее.

  • Отправьте учетные данные клиента на сервер для олицетворения или делегирования .
  • Запросить аутентификацию сервера.
  • Зашифровать и / или подписать данные перед их передачей.

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

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

Итак, вот мой код:

Dim Client As TcpClient = Listener.AcceptTcpClient
Using AuthStream As New NegotiateStream(Client.GetStream, False)
                AuthStream.AuthenticateAsServer(Net.CredentialCache.DefaultCredentials, ProtectionLevel.EncryptAndSign, TokenImpersonationLevel.Impersonation)
                Dim ClientUser As New WindowsPrincipal(AuthStream.RemoteIdentity)
                'Now what?
End Using

Некоторые примеры, кажется, думают, что это то же самое, что и олицетворение:

Dim ClientUser As New WindowsPrincipal(AuthStream.RemoteIdentity)
Threading.Thread.CurrentPrincipal = ClientUser

Но это совсем не то же самое, что олицетворение . После этого программа не сможет получить доступ к файлам, к которым, например, может получить доступ только аутентифицированный удаленный пользователь.

Итак, как мы собираемся использовать Iidentity (или WindowsPrincipal, построенный на его основе) из NegotiateStream, чтобы фактически выполнить олицетворение?

ПРИМЕЧАНИЕ. Это необходимо сделать из настольного приложения или службы windows, не , приложения ASP. NET или службы WCF .

1 Ответ

0 голосов
/ 06 мая 2020

Только что понял, что мы можем преобразовать IIdentity, полученное из потока, в WindowsIdentity, а затем использовать это для олицетворения следующим образом:

            Using AuthStream As New NegotiateStream(Client.GetStream, False)
                AuthStream.AuthenticateAsServer(CredentialCache.DefaultCredentials, ProtectionLevel.EncryptAndSign, TokenImpersonationLevel.Impersonation)
                Dim ClientIdentity As WindowsIdentity = DirectCast(AuthStream.RemoteIdentity, WindowsIdentity)
                Using ClientContext As WindowsImpersonationContext = ClientIdentity.Impersonate
                    'Do stuff as the remote user here'
                End Using
            End Using

Нужно проверить это, когда я ' Мы реализовали клиентскую часть и запустили ее в тестовом домене, но я думаю, что она должна работать.

РЕДАКТИРОВАТЬ: Протестировано, и все работает как ожидалось

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