4

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

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

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

4

5 回答 5

8

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

[MS-N2HT]:协商和 Nego2 HTTP 身份验证协议

我支持审查Apache 代码的 mod_auth_sspi的建议

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

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

长答案涉及很少的阅读:

维基百科中的集成 Windows 身份验证

Microsoft Windows 中基于 SPNEGO 的 Kerberos 和 NTLM HTTP 身份验证

通过协商协议进行基于 HTTP 的跨平台身份验证(第 1 部分,共 3 部分)

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

希望这可以帮助!

于 2009-07-30T01:38:09.443 回答
2

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

于 2009-08-08T13:31:33.360 回答
1

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

于 2009-07-23T13:11:21.577 回答
1

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

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

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

于 2009-08-08T11:18:19.707 回答
0

这是一个 java 实现,您可能会发现它很有用

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

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

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

于 2009-07-30T03:12:24.197 回答