2012-02-21 94 views
2

简单地说:我可以生成C++某种文本信息 - 用户令牌,会话令牌,访问令牌 - 当前登录的Windows用户,然后验证该文本信息(认证用户(?) )其他地方(域中的不同计算机)?Windows身份验证令牌C++

passing string token

我有两台电脑。在第一个用户应该能够通过客户端应用程序连接到我的服务器应用程序运行在第二台计算机上。他必须使用Windows身份验证,因此服务器将使用他的Windows组获取一些信息 - 无需发送用户名/密码。我的想法是(不知道是否有可能)是客户机/进程知道当前用户,所以它会获取用户的访问令牌或类似的东西,传递到服务器(作为字符串参数),服务器将验证这个令牌字符串是有效的,并将获得该用户和他的组的下一个操作的名称,这就是我需要的。

这可能只是一个信息,从客户端发送到服务器(此访问令牌/会话令牌或如何调用)? (http服务器,我只是想发送一个字符串令牌一次与一个登录请求,目前用于其他专有方式的身份验证,没有握手/谈判或类似的东西,如果可能的话)。我正在使用C++。

我目前发现的两种方式(可能的方式如何不这样做;))

1)像OpenProcessToken,GetTokenInformation功能 - 这让我获得访问令牌,但它仅仅是处理,我也许可以用它只有在我的过程中,不可能发送到其他地方...

2)像AcquireCredentialsHandle,InitializeSecurityContext,AcceptSecurityContext - 今天的功能我花了很多时间与此 - 我做了一些测试应用程序使用这些功能,只是运行在一个过程中,我目前不确定如何通过两台计算机之间的“文本”通信来实现,但这并不重要 - 似乎有更多的回合必须做 - 客户端创建一些东西(上下文,证书,令牌等),将它发送到服务器,服务器做一些事情,回应客户端,客户端获得结果等。我可以通过创建“会话令牌“并发送它(例如,如果需要,使用域@用户名),而没有其他信息返回并在那里呢?

任何帮助表示赞赏,谢谢!

编辑:基于下面的第一条评论,似乎我需要澄清这一点: 想象一下,用户运行Web浏览器并连接到我的服务器应用程序的其他地方。他想发送像“CONNECT”和“DO_STUFF”这样的命令。只有该用户可以先连接,服务器应用程序才会do_stuff。但是,这个用户只能连接,例如,它是一些Windows组的成员(使用Windows身份验证,而不是某些专有用户和密码)。所以服务器必须检查这个用户是否是该组的有效成员。但是服务器当然可以根据用户提供的文本信息来做到这一点。那么,用户可以发送他的Windows用户名和密码通过服务器应用程序进行身份验证(应该由C++函数LogonUser或其他)完成,但这是危险的,我不希望用户在某处输入他的用户名和密码,我只是想要他“点击登录按钮”和C++会在乎休息,因为它可以检查他当前会话的数据,他已经登录。我的想法是只提供用户名和某种类型的字符串用户令牌(会话令牌,访问令牌,我不知道这将用户的客户端应用程序生成精确的术语)(使用Kerberos,NTLM,我不知道)和服务器将收到此字符串信息,它会检查该令牌验证,“这是有效的有效的Windows用户的标记,这里是他所属的组“......类似的东西。希望这个解释有帮助。

+0

我假设你已经考虑过远程桌面/ RDP并且它不工作? – Widor 2012-02-21 15:31:04

+0

使用远程桌面是什么意思?这是C++编写的应用程序,它将根据客户端应用程序在不同计算机上提供的信息对用户进行身份验证,该用户已登录。我需要从客户端应用程序获取一些信息以允许登录到服务器应用程序(例如,如果用户处于一些特殊的窗口组使其变得简单)。我不想发送赢取用户名和赢取密码,我想发送赢取用户名和赢取令牌。 – user1173626 2012-02-21 15:46:48

+0

好吧,它是C#,但这听起来像你可能会尝试:http://stackoverflow.com/questions/288796/how-to-use-terminal-services-programmatically – Widor 2012-02-21 16:06:10

回答

3

像AcquireCredentialsHandle,InitializeSecurityContext,AcceptSecurityContext和类似的功能在这里是解决方案。

检查http://msdn.microsoft.com/en-us/library/ms973911.aspx#remsspi_topic3

如果你只想验证用户,NTLM是好的,但你需要交换多个消息,它不能只是一个步骤中完成,因为我本来要求(需要:谈判,挑战,回复),所以你实际上发送了3条短信,并通过上述功能处理它们。

如果您想要委派(服务器可以充当客户端 - 模拟 - 甚至将权限委托给其他进程),您需要使用Kerberos(需要Active Directory)。一切都必须在一个领域完成。这可以通过基于下面的图像从客户端向服务器发送更少的消息来实现,因为权限涉及更多,但是我没有测试过这种情况。

NTLM and Kerberos handshake http://i.msdn.microsoft.com/dynimg/IC10253.gif