在C#中实现传递身份验证

时间:2012-05-18 09:59:15

标签: c# .net windows authentication pass-through

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

我如何在我的申请中执行此操作?我想到了某种可以发送到服务器的令牌,但我找不到任何解决方案。

3 个答案:

答案 0 :(得分:2)

将NetworkStream包裹在NegotiateStream中,并在客户端和服务器上调用相应的NegotiateAs...方法。

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

经过身份验证后,服务器可以使用NegotiateStream的RemoteIdentity属性确定客户端的身份和/或模拟。

正如我在评论中提到的,我不知道Citrix如何影响此设置(从未使用过它),但如果它对应用程序基本上完全透明,并且所有内容都使用标准Windows凭据,那么这应该可行。

答案 1 :(得分:1)

答案 2 :(得分:0)

如果您同时编写应用程序的客户端和服务器部分,则可以加密用户的凭据以通过网络并在另一端进行解密。

假设在客户端计算机上,恶意用户可以从您的应用程序中提取加密密钥(使用strings或类似内容),则对称加密不适用。因此,非对称(公共 - 私有)加密似乎是合适的。生成一对密钥,服务器密钥应保持私有(并且仅在服务器上),客户端密钥可以包含在客户端计算机上的应用程序中。然后,如果密钥是从应用程序中提取的,则无关紧要,因为凭证只能使用服务器上的机密和安全私钥进行解密。 This class为您完成了大部分基础工作。