使用python-kerberos实现HTTP Negotiate在Windows与Unix服务器上的区别
我尝试在我的Python网络服务器上实现一个简单的单点登录功能。我使用了python-kerberos这个包,效果不错。我在我的Linux电脑上测试过(和活动目录进行身份验证),没有问题。不过,当我在Windows机器上用Firefox进行身份验证时(没有特别的设置,只要用户登录到域,并把我的服务器加到negotiate-auth.trusted-uris里),就不行了。我查看了发送的数据,发现它和Linux机器发送的完全不一样。这个微软的描述和我在Linux上的操作过程很相似,但Windows机器发送的字符串非常短,甚至和微软文档上说的内容不符,经过base64解码后,得到的结果是12个零字节后面跟着3或4个非零字节(GSS函数返回说不支持这种方案)。
可能是Firefox客户端的设置有问题,或者我应该遵循某种协议来实现Negotiate协议,但我找不到任何相关的参考资料。你觉得问题出在哪里?你知道我应该寻找什么协议吗?因为从微软的文档来看,这看起来不像是SPNEGO。
更新:现在似乎至少能产生合理的数据(在不同于Windows 7的全新Firefox安装上...),不过我遇到了这个错误: (('未指定的GSS失败。次要代码可能提供更多信息', 851968), ('', 100004)) 现在Negotiate数据似乎没问题,所以这是另一个错误。你知道我在哪里可以解码100004是什么意思吗?
1 个回答
在Windows系统上,你还需要确保设置 network.auth.use-sspi = true,这样Firefox浏览器就会使用Windows自带的Kerberos(SSPI),而不是去寻找一个叫GSSAPI的DLL文件。
如果不是这个问题,且你想提供一些关于Kerberos和HTTP流量的数据包捕获,我很乐意帮你看看。