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服务来完成。
刚刚意识到,我们可以将流中获得的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
一旦实现了客户端并在测试域上运行它,就需要对其进行测试,但是我认为它应该可以工作。