4

我正在开发一个基于 TcpClient/TcpListener 的客户端-服务器应用程序。现在我已经到了需要对用户进行身份验证的地步。我可以在服务器端使用 PrincipalContext-Class 并从客户端请求用户名/密码/域,但我不想通过网络发送凭据。此外,我不想再次向用户询问他们的凭据。所以,我知道支持直通身份验证的 Citrix Receiver。它使用当前登录的用户并且不请求任何凭据并针对服务器对用户进行身份验证。它只是工作。

我怎样才能在我的应用程序中做到这一点?我想过某种可以发送到服务器的令牌,但我找不到任何解决方案。

4

3 回答 3

2

将 NetworkStream 包装在NegotiateStreamNegotiateAs...中,并在客户端和服务器上调用适当的方法。

客户端可以指定允许的模拟级别,服务器可以指定它需要的级别(最低限度Identification是为了确定客户端身份,但是如果您需要作为客户端访问本地或网络资源,您还可以指定Impersonation或,使用正确的网络配置,Delegation)。

一旦通过身份验证,服务器就可以确定客户端的身份和/或使用 NegotiateStream 的RemoteIdentity属性进行模拟。

As I mentioned in my comment, I don't know how Citrix affects this setup (never having used it), but if it's basically completely transparent to the application and everything uses standard Windows credentials, then this should work.

于 2012-05-18T11:56:33.787 回答
1

.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

于 2012-05-18T10:31:59.287 回答
0

如果您正在编写应用程序的客户端和服务器部分,那么您可以加密用户的凭据以通过网络传递并在另一端解密。

假设在客户端计算机上,恶意用户可以从您的应用程序中提取加密密钥(使用字符串或类似的),那么对称加密不适合。因此非对称(公私)加密似乎是合适的。生成一对密钥,服务器的密钥应该保持私有(并且仅在服务器上),并且客户端的密钥可以包含在客户端计算机上的应用程序中。那么密钥是否从应用程序中提取并不重要,因为凭证只能使用服务器上的秘密和安全私钥解密。本课程为您完成了大部分基础工作。

于 2012-05-18T10:23:13.677 回答