【问题标题】:NTLM authentication for a web server side applicationWeb 服务器端应用程序的 NTLM 身份验证
【发布时间】:2009-07-23 07:51:16
【问题描述】:

我用 C++ 编写的基于 Windows 的应用程序(基本上是一个 HTTP/1.1 代理服务器)侦听来自不同用户的请求。 目前它能够发送 407 基本挑战,并处理来自标头的响应。 我知道我必须修改质询标头,以便客户端浏览器出于身份验证的目的做出基于 NTLM 的响应。但我的问题是 - 如何为 407 身份验证质询生成正确的令牌、随机数等,然后如何验证收到的响应是否正确?最后,如果可能的话,我想记录下客户端的用户名和其他 LDAP / ADS 属性。

请善待,如果已经有任何讨论类似问题的线程,请将我重定向到正确的帖子。对 WWW 的大多数研究只将我引向客户端编程,很少或几乎没有——因为必须在 HTTP 服务器中完成编码。

你们这里的所有伟大的黑客,提前非常感谢。

【问题讨论】:

    标签: c++ c ntlm http-authentication


    【解决方案1】:

    简短的回答是我认为这个Using SSPI with a Windows Sockets Server 样本 是您最好的起点,它应该演示您需要的基本 SSPI 调用。它是为普通的 TCP 服务器编写的,但挑战/响应数据是通过 HTTP 发送的,没有太多额外的复杂性。

    [MS-N2HT]: Negotiate and Nego2 HTTP Authentication Protocol

    我赞同审阅the mod_auth_sspi for Apache code的建议

    就个人而言,我也会尝试在 IIS 上附加一个低级调试器,看看他是如何调用 SSPI 函数的,但这可能不是你的菜。

    在您了解 SSPI 之后,获取用户名应该是小菜一碟(但请询问您是否需要帮助)。可以使用这些 API 查询用户的 LDAP/AD 属性。

    冗长的答案涉及少量阅读:

    Integrated Windows Authentication in Wikipedia

    SPNEGO-based Kerberos and NTLM HTTP Authentication in Microsoft Windows

    HTTP-Based Cross-Platform Authentication via the Negotiate Protocol (Part 1 of 3)

    第 3 部分也有一些有趣的代码示例。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      httpauth 中有可以帮助您的代码。它使用 smbval 代码来解析 NTLM 消息 1 和 3。请参阅:http://memberwebs.com/stef/software/httpauth/

      【讨论】:

      • httpauth 可能非常有用,但不幸的是,文档还不够。尽管如此,它看起来还是很有希望的。其中的 docs 文件夹包含一个protocols.txt,但需要大量破解!我还在玩它,我不知道它是否真的有效。但如果是这样,它可以让鱿鱼/桑巴卡特尔的家伙跳出他们的袜子!我相信还有更多像我这样希望它真的有效的人!
      • 我检查了 httpauth,为基于 linux 的代理服务器版本进行 NTLM 身份验证。这是一个很好的解决方案,比 ntlm_auth + winbind 解决方案好得多,而且绝对更优雅。绝对是一种希望与多线程应用程序一起使用的解决方案。尚未研究重用 httpauth 中部分代码的想法。注意 - httpauth 本身并不支持代理身份验证标头,因此代理应用程序必须做一些额外的工作。
      【解决方案3】:

      您可以通过查看mod_auth_sspi Apache 模块找到灵感

      【讨论】:

        【解决方案4】:

        经过一番努力,我终于走到了这一步: 在我的代理服务器上,我可以挑战客户端进行基本/NTLM 身份验证。当用户做出“基本”响应时,我可以使用 SSPI 验证凭据。该文档有帮助:http://support.microsoft.com/kb/180548

        但是,我无法完成基于 NTLM 的挑战和响应。基本上我可以通过 407 Proxy-authenicate 来“挑逗”客户端选择基于 NTLM 的身份验证系统,这基本上需要 3 条消息。第一条消息必须是客户端发送的基于 NTLM 的请求,第二条消息来自我的服务器,第三条消息来自客户端。现在的问题是“我如何生成 NTLM 质询,然后解密或验证 NTLM 授权,即消息 3。

        非常感谢 Marsh 和其他优秀的黑客,感谢你们做出的所有努力,做出了回应。我只能希望你愿意分享更多。

        【讨论】:

          【解决方案5】:

          这是一个你可能会觉得有用的 java 实现

          http://www.luigidragone.com/networking/ntlm.html

          而且,确实更有用的是,尝试记录未记录的 ntlm 方案

          http://www.innovation.ch/personal/ronald/ntlm.html

          【讨论】:

            猜你喜欢
            • 2012-08-03
            • 2016-11-03
            • 2017-02-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多