c++ - Windows 身份验证 token C++

标签 c++ windows-authentication

简单地说:我可以在 C++ 中生成当前登录 Windows 用户的某种文本信息 - 用户 token 、 session token 、访问 token (?),然后在某处验证此文本信息(对用户进行身份验证)否则(域中的不同计算机)?

passing string token

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

仅通过从客户端发送到服务器的一个信息(此访问 token / session token 或如何调用它)就可以实现这一点吗? (http服务器,我只想通过一个登录请求发送该字符串 token 一次,该请求当前用于其他专有的身份验证方式,如果可能的话,无需握手/协商或类似的操作)。我正在使用 C++。

我目前找到了两种方法(可能是不这样做的方法;))

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

2) 像 AcquireCredentialsHandle、InitializeSecurityContext、AcceptSecurityContext 这样的函数 - 今天我花了很多时间在这上面 - 我使用这些函数制作了一些测试应用程序,只是在一个进程中运行,我目前不太确定应该如何制作它通过两台计算机之间的“文本”通信,但这并不重要 - 似乎需要进行更多轮 - 客户端创建一些东西(上下文,凭据, token ,...),将其发送到服务器,服务器执行某些操作,响应客户端、客户端获取结果等。我可以仅通过创建“ session token ”并发送它(例如,如果需要,使用域@用户名)来完成此操作,而无需返回其他信息吗?

感谢任何帮助,谢谢!

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

最佳答案

AcquireCredentialsHandle、InitializeSecurityContext、AcceptSecurityContext 等函数是此处的解决方案。

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

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

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

NTLM and Kerberos handshake
(来源:microsoft.com)

关于c++ - Windows 身份验证 token C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9380220/

相关文章:

windows - 匿名之前的 IIS Windows 身份验证

c# - .net Core 2.1 应用程序中的 Windows 身份验证

javascript - 如何使用 Windows 身份验证在 IIS 上授权 CORS 预检请求

c# - 使用 HttpClient 将 Windows 身份验证传递给代理

c++ - Boost序列化编译错误

c++ - 哪个递归函数会占用更少的内存?

c++ - QT:addLayout 导致崩溃

c++ - 为什么我的循环只执行一次?

c++ - 用 C++ 编写状态机

iis - 本地 iis 上的 asp.net core windows 身份验证