我被要求在现有客户端服务器应用程序中针对Active Directory对用户进行身份验证提供支持。
目前,用户从客户端计算机提供用户名和密码,通过线路(加密)传递到我们的服务器进程,并与存储在数据库中的用户名/密码进行匹配。
最初,我认为这将是一个容易解决的问题,因为我可以简单地从我们的服务器进程中针对Active Directory验证用户的名称/密码。但事实证明,用户不必从我们的客户端应用程序输入密码,而是从当前的 Windows 登录会话中获取凭据。
我现在面临的问题是如何在没有密码的情况下使用Active Directory进行身份验证?我确信必须有某种方式从某种方式传递某种“令牌”客户端到我们的服务器进程可以用作替代身份验证方法,但到目前为止我的研究已经画了一个空白。
我们的服务器是用C ++编写的,所以我们将使用win32 API。我还打算使用运行Windows 2008 AD LDS的虚拟机来开发和调试它 - 我希望这对我想要实现的目标已经足够了。
非常感谢任何帮助或建议。
答案 0 :(得分:10)
您执行NTLM / Kerberos / Negotiate SSPI exchange loop。 MSDN上有client和server的完整示例。要明确:您不明确使用任何类型的LDAP访问。 LSA(本地安全机构)是否与LDAP通信并建立客户端的身份。如果您在执行整个SSPI循环时成功,则身份验证已成功,并且客户端身份已经 alread 针对LDAP进行身份验证。如果您的服务器需要知道客户端身份(例如,知道使用rname),它将使用QueryContextAttributes(..., SECPKG_ATTR_NAMES,...)
从导致SSPI循环的安全上下文中检索它,并从SecPkgContext_Names
结构中检索用户名