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

Windows身份验证令牌C++; >简单地说:我能在C++中生成某种文本信息-当前登录的Windows用户的用户令牌、会话令牌、访问令牌(?),然后在其他地方(域中的不同计算机)验证该文本信息(认证用户)吗?< /强> < /P>,c++,windows-authentication,C++,Windows Authentication,我有两台电脑。在第一台计算机上,一个用户应该能够通过客户端应用程序连接到第二台计算机上运行的我的服务器应用程序。他必须使用Windows身份验证,所以服务器将使用他的Windows组获取一些信息-无需发送用户名/密码。我的想法是(不知道是否可能)客户端计算机/进程知道当前用户,因此它将获取用户的访问令牌或类似的东西,将其传递给服务器(作为字符串参数),服务器将验证该令牌字符串是否有效,并将获取该windows用户及其组的名称,以便进行下一步操作,这就是我需要的 仅通过从客户端发送到服务器的一个信

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

仅通过从客户端发送到服务器的一个信息(此访问令牌/会话令牌或如何调用该令牌)就可以做到这一点吗?(http服务器,我只想用一个登录请求发送该字符串令牌一次,该请求目前用于其他专有的身份验证方式,如果可能的话,不需要握手/协商或类似的方式)。我用的是C++。 我目前发现了两种方法(可能是如何不这样做的方法;)

1) 像OpenProcessToken,GetTokenInformation这样的函数-这让我可以访问访问令牌,但它只是一个句柄,我可能只能在我的进程中使用它,不可能将它发送到其他地方

2) 像AcquireCredentialsHandle、InitializeSecurityContext、AcceptSecurityContext这样的函数-今天我花了很多时间在这方面-我使用这些函数制作了一些测试应用程序,只是在一个进程中运行,我目前还不确定“文本”应该如何制作两台计算机之间的通信,但这并不重要-似乎需要进行更多的轮次-客户端创建某些内容(上下文、凭据、令牌等),将其发送到服务器,服务器执行某些操作,响应客户端,客户端获取结果,等等。我可以通过创建“会话令牌”并发送它来完成吗(例如domain@username如有必要)没有其他信息的情况下来回

感谢您的帮助,谢谢

编辑:根据以下第一条评论,我似乎需要进一步澄清:
假设用户运行web浏览器并连接到其他地方的我的服务器应用程序。他希望发送“连接”和“完成任务”等命令。只有当此用户可以首先连接时,服务器应用程序才会执行任务。但是,例如,仅当此用户是某个windows组的成员时,此用户才能进行连接(使用windows身份验证,而不是某些专有用户和密码)。因此服务器必须检查此用户是否是该组的有效成员。但服务器当然可以根据用户提供的文本信息来执行此操作。用户可以通过服务器应用发送其windows用户名和密码进行身份验证(应该由C++函数登录用户或其他任何东西来做),但这是危险的,我不想让用户输入他的用户名和密码,我只是想让他“点击登录按钮”。并且C++会关心其余的,因为它可以检查当前的会话数据,他已经登录了。我的想法是提供用户名和某种字符串用户令牌(会话标记,访问令牌,我不知道确切的术语),这将由用户客户端应用程序生成(使用Kerberos,NTLM,我不知道)。服务器将收到此字符串信息,它将检查此令牌以验证“这是有效windows用户的有效令牌,以下是他所属的组”…诸如此类。希望这个解释能有所帮助。

像AcquireCredentialsHandle、InitializeSecurityContext、AcceptSecurityContext之类的函数都是这里的解决方案

检查

如果您只想对用户进行身份验证,NTLM是可以的,但您需要交换多条消息,这不能像我最初要求的那样一步完成(需要:协商、质询、响应),因此您实际上发送了3条文本消息,并通过上述函数处理它们

如果您想委托(服务器可以充当客户端-模拟-甚至将权限委托给其他进程),您需要使用Kerberos(需要Active Directory)。所有操作都必须在一个域中完成。这可能是通过根据下图从客户端向服务器发送较少的消息来实现的,因为权限更为重要,但我尚未测试此场景



(来源:)

像AcquireCredentialsHandle、InitializeSecurityContext、AcceptSecurityContext和类似的函数都是这里的解决方案

检查

如果您只想对用户进行身份验证,NTLM是可以的,但您需要交换多条消息,这不能像我最初要求的那样一步完成(需要:协商、质询、响应),因此您实际上发送了3条文本消息,并通过上述函数处理它们

如果您想委托(服务器可以充当客户端-模拟-甚至将权限委托给其他进程),您需要使用Kerberos(需要Active Directory)。所有操作都必须在一个域中完成。这可能是通过根据下图从客户端向服务器发送较少的消息来实现的,因为权限更为重要,但我尚未测试此场景



(来源:)

我假设你已经考虑过远程桌面/RDP,但它没有用,你指的是使用远程桌面?这是C++编写的应用程序,它将基于客户端应用程序提供的信息在不同的计算机上进行验证,用户登录该计算机。我需要从客户端应用程序获取一些信息,以便允许登录到服务器A。pp(例如,如果用户在某个特殊的windows组中以使其变得简单)。我不想发送win用户名和win密码,我想发送win us