我正在尝试向我公司的一个服务器进行身份验证。我第一次尝试连接时返回一个401,报头为:
www-authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAVU9wgQTnlrgAAAAAAAAAAA==解析base64部分,我得到了如下结果:
0000 4E 54 4C 4D 53 53 50 00 02 00 00 00 00 00 00 00 NTLMSSP.........
0010 28 00 00 00 01 82 00 00 B6 70 AC 57 8C D0 07 44 (........p.W...D
0020 00 00 00 00 00 00 00 00 ........然后解析成这个:
Signature = NTLMSSP
msg_type = 2
TargetNameLen = 0
TargetNameMaxLen = 0
TargetNameOffset = 40
NegotiateFlags = 0x8201
ServerChallenge = B6 70 AC 57 8C D0 07 44这就是我应该提到的地方,我不会自己解析它。我认为这无关紧要,但我使用的是Python2.7,其中包含新安装的python_ ntlm -1.0.1和requests-ntlm 0.0.2.1的副本,并且ntlm模块在其parse_NTLM_CHALLENGE_MESSAGE例程中崩溃,因为数据包太短。从偏移量0x0020开始,显然应该有一个16字节的保留区域,后面跟着三个32位整数,而保留区域中只有8个字节的十六进制00,其他数字都丢失了。这是我第一次需要比基本身份验证更多的东西。我怀疑TargetNameLen为0意味着一些特殊的东西,但是在我向python_ntlm维护者提交错误报告之前,有人能帮我解释一下我得到的数据吗?
谢谢!
发布于 2013-02-06 22:36:08
事实证明,问题出在如何解释NegotiateFlags字段。根据微软公布的规范,有两点令人感兴趣。如果未设置NTLMSSP_REQUEST_TARGET标志,则不需要TargetName,而如果未设置NTLMSSP_NEGOTIATE_TARGET_INFO,则不需要TargetInfo。但是,由于多年来数据包格式的演变,TargetName字段在NegotiateFlags之前,因此即使被忽略,它们也必须存在并且填充为零。另一方面,TargetInfo字段出现在NegotiateFlags字段之后,因此可以省略,留下较短的数据包。我已经提交了python-ntlm项目的补丁,一切都应该很快就会解决。我提供了这个解决方案,以防将来其他编写自己的身份验证代码的人遇到麻烦。
https://stackoverflow.com/questions/14652521
复制相似问题