我正在开发基于TcpClient / TcpListener的客户端服务器应用程序。 现在我已经到了需要authentication用户的地步。 我可以在服务器端使用PrincipalContext-Class,并从客户端请求用户名/密码/域,但我不想通过networking发送凭据。 另外,我不想再次询问用户的凭据。 所以,我知道支持传递身份validation的Citrix Receiver。 它使用当前login的用户,不要求任何凭证,并根据服务器对用户进行身份validation。 它只是工作。
我如何在我的应用程序中做到这一点? 我想过一些可以发送到服务器的令牌,但我找不到任何解决scheme。
将NetworkStream包装在NegotiateStream中 ,并在客户端和服务器上调用适当的NegotiateAs...
方法。
客户端可以指定允许的模拟级别,服务器可以指定它需要的级别(为了确定客户端身份,最低限度地Identification
,但是如果您需要访问本地或网络资源作为客户端,则还可以指定Impersonation
,与正确的网络配置, Delegation
)。
通过身份验证后,服务器可以使用NegotiateStream的RemoteIdentity
属性确定客户端的身份和/或模拟。
正如我在我的评论中提到的,我不知道Citrix如何影响这个设置(从来没有使用它),但是如果它对于应用程序基本上是完全透明的,并且所有东西都使用标准的Windows凭据,那么这应该起作用。
.net框架确实有diffie-hellmann密钥交换的功能:
http://de.wikipedia.org/wiki/Diffie-Hellman-Schl%C3%BCsselaustausch
http://www.codeproject.com/Articles/24632/Shared-Key-Generation-using-Diffie-Hellman
如果您正在编写应用程序的客户端和服务器部分,则可以对用户的凭证进行加密,以便通过网络传递并在另一端进行解密。
假设在客户端机器上,恶意用户可以从应用程序中提取加密密钥(使用字符串或类似方法),那么对称加密就不适用。 因此,不对称(公私)加密似乎是合适的。 生成一对密钥,并且服务器的密钥应该保持私密(并且只能在服务器上),并且客户机的密钥可以包含在客户机上的应用程序中。 然后,从应用程序中提取密钥并不重要,因为凭据只能使用服务器上的秘密和安全私钥解密。 这门课为你做了大部分的基础工作。