在客户端 - 服务器应用程序中使用Active Directory验证用户

时间:2009-08-26 22:35:08

标签: c++ authentication winapi active-directory ldap

我被要求在现有客户端服务器应用程序中针对Active Directory对用户进行身份验证提供支持。

目前,用户从客户端计算机提供用户名和密码,通过线路(加密)传递到我们的服务器进程,并与存储在数据库中的用户名/密码进行匹配。

最初,我认为这将是一个容易解决的问题,因为我可以简单地从我们的服务器进程中针对Active Directory验证用户的名称/密码。但事实证明,用户不必从我们的客户端应用程序输入密码,而是从当前的 Windows 登录会话中获取凭据。

我现在面临的问题是如何在没有密码的情况下使用Active Directory进行身份验证?我确信必须有某种方式从某种方式传递某种“令牌”客户端到我们的服务器进程可以用作替代身份验证方法,但到目前为止我的研究已经画了一个空白。

我们的服务器是用C ++编写的,所以我们将使用win32 API。我还打算使用运行Windows 2008 AD LDS的虚拟机来开发和调试它 - 我希望这对我想要实现的目标已经足够了。

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:10)

您执行NTLM / Kerberos / Negotiate SSPI exchange loop。 MSDN上有clientserver的完整示例。要明确:您明确使用任何类型的LDAP访问。 LSA(本地安全机构)是否与LDAP通信并建立客户端的身份。如果您在执行整个SSPI循环时成功,则身份验证已成功,并且客户端身份已经 alread 针对LDAP进行身份验证。如果您的服务器需要知道客户端身份(例如,知道使用rname),它将使用QueryContextAttributes(..., SECPKG_ATTR_NAMES,...)从导致SSPI循环的安全上下文中检索它,并从SecPkgContext_Names结构中检索用户名