我正在一个Java应用服务器上安装spnego,它将根据活动目录对用户进行身份验证。我已经严格遵循了所有方向,并且ad preauth帐户在serviceprincipalname属性中有java应用服务器fqdn。我们已经安装了另一个spnego正常工作的java应用服务器(我没有安装,它们也不再在这里)。
我开发了一个简单的javaee6web应用程序来测试spnego是否正常工作(带有request.getremoteuser()的jsp页面)。当我在现有服务器上运行这个应用程序时,我正确地获得了我的用户名响应。当我在正在设置的新服务器上运行它时,会出现以下错误:
java.lang.UnsupportedOperationException: NTLM specified. Downgraded to Basic Auth (and/or SSL) but downgrade not supported.
使用fiddler检查会话,authorization:negotiate令牌请求到正常工作的服务器是一个巨大的字符串(我相信kerberos令牌?)。授权:协商令牌请求到非工作服务器的长度只有56个字符(所以,ntlm token?)。当服务器收到该ntlm令牌时,我相信这就是抛出错误的时间。
我已经检查了先前协商会话的响应,但是找不到服务器请求kerberos与ntlm令牌的位置。浏览器如何确定发送内容?
其他详细信息:Java应用服务器计算机:Windows 2008 R2、Java 1.7、GlassFish 3.1.2.2
客户机:标准公司Windows域上的Windows 7 Enterprise、IE8
谢谢。
最佳答案
serviceprincipalname不仅仅是fqdn;它还需要包含服务。比如:HTTP/MYSERVER.MYDOMAIN.COM
。
您在web浏览器中访问的地址必须与该fqdn匹配。事实上,您可以在os hosts文件中添加与此fqdn匹配的任何ip,它应该可以正常工作(即使ip是127.0.0.1并且您希望在本地测试spnego kerberos)
在浏览器操作系统的命令提示下,运行:klist get HTTP/MYSERVER.MYDOMAIN.COM
,并验证您是否获得票证。我想这会失败的。
假设第三点失败,那么kerberos配置(而不是浏览器/web服务器)在您的客户端操作系统或kdc上会有更大的问题。
关于http - Web浏览器(IE8)如何确定要为授权:协商请求 header 发送的 token ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16697447/