【问题标题】:Authenticating users using Active Directory in Client-Server Application在客户端-服务器应用程序中使用 Active Directory 对用户进行身份验证
【发布时间】:2023-03-07 23:37:01
【问题描述】:

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

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

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

我现在面临如何在没有密码的情况下使用 Active Directory 进行身份验证的问题?我确信一定有一种方法可以通过某种方式从客户端到我们的服务器进程,可以用作替代身份验证方法,但我的研究到目前为止还一片空白。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • @flipdoubt: 在两个 C# 应用程序之间使用 NegotiateStream 见msdn.microsoft.com/en-us/library/…
    • 请注意,应该使用SecPkgContext_NativeNames 来获取机制类型的用户名。在 Kerberos 中,这将是 UPN,而不是旧名称类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    相关资源
    最近更新 更多