Net.Security.NegotiateStream的模拟

问题描述 投票:0回答:1

MSDN documentation类的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

但是与假冒完全不同。之后,该程序将无法访问仅经过身份验证的远程用户才能访问的文件。

所以我们应该如何使用从NegotiateStream获得的Identity(或以此为基础构建的WindowsPrincipal)来进行模拟?

注意:这需要通过桌面应用程序或Windows服务,不是 ASP.NET应用程序或WCF服务来完成。

c# vb.net impersonation
1个回答
0
投票

刚刚意识到,我们可以将流中获得的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

一旦实现了客户端并在测试域上运行它,就需要对其进行测试,但是我认为它应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.