当SPNEGO Kerberos身份验证失败时,Chrome显示ERR_UNEXPECTED

问题描述:

我按照此guide将我的系统与Windows AD集成。所以当有人登录windows域用户时,他可以自动登录到cas。如果用户不使用域用户,我希望系统返回正常的html登录页面。当SPNEGO Kerberos身份验证失败时,Chrome显示ERR_UNEXPECTED

现在我有一个问题,当我使用域用户时,它工作正常。但是当我使用非域用户时,chrome返回ERR_UNEXPECTED错误页面给我。你可以看到tcp dump,系统已经返回401和登录页面html,但是chrome显示错误。

任何人都可以给我一些建议吗?

JVM:1.8.0_111

CAS-服务器核:3.3

CAS-服务器支持-SPNEGO:3.3

铬:通过Wireshark的55

TCP转储流(非域名用户)

GET /cas/login?service=http%3A%2F%2Fserver.ictsm.com%3A8080%2Fapp%2F&_validateRequest_=7RBrB6AIqjijhw5c4LjTBvc1vjpHJHWafif1MXGmMr8ZyI22thbzCtqTYkCUfKOn HTTP/1.1 
Host: server.ictsm.com:8080 
Connection: keep-alive 
Cache-Control: max-age=0 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
DNT: 1 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: zh-CN,zh;q=0.8 
Cookie: JSESSIONID=3A632B243F57094E9468F972D2BE2E04A48835CCEE575DC9F8B2527FA81E23AD6D48BBF69A6D35623080096949F1FB8092F4 

HTTP/1.1 401 Unauthorized 
Server: nginx 
Date: Mon, 16 Jan 2017 07:19:00 GMT 
Content-Type: text/html;charset=UTF-8 
Transfer-Encoding: chunked 
Connection: keep-alive 
Pragma: no-cache 
Expires: Thu, 01 Jan 1970 00:00:00 GMT 
Cache-Control: no-cache 
WWW-Authenticate: NTLM 
WWW-Authenticate: Negotiate 
Content-Language: zh-CN 

my login page html 

GET /cas/login?service=http%3A%2F%2Fserver.ictsm.com%3A8080%2Fapp%2F&_validateRequest_=7RBrB6AIqjijhw5c4LjTBvc1vjpHJHWafif1MXGmMr8ZyI22thbzCtqTYkCUfKOn HTTP/1.1 
Host: server.ictsm.com:8080 
Connection: keep-alive 
Cache-Control: max-age=0 
Authorization: Negotiate TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw== 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
DNT: 1 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: zh-CN,zh;q=0.8 
Cookie: JSESSIONID=3A632B243F57094E9468F972D2BE2E04A48835CCEE575DC9F8B2527FA81E23AD6D48BBF69A6D35623080096949F1FB8092F4 

HTTP/1.1 401 Unauthorized 
Server: nginx 
Date: Mon, 16 Jan 2017 07:19:00 GMT 
Content-Type: text/html;charset=UTF-8 
Transfer-Encoding: chunked 
Connection: keep-alive 
Pragma: no-cache 
Expires: Thu, 01 Jan 1970 00:00:00 GMT 
Cache-Control: no-cache 
WWW-Authenticate: Negotiate TlRMTVNTUAACAAAAEgASADAAAAAFAoEAAAAAAAAAAAAAAAAAAAAAADoAOgBCAAAAaQBjAHQAcwBtAC4AYwBvAG0AAgASAGkAYwB0AHMAbQAuAGMAbwBtAAEAHABKAEMASQBGAFMAMQAzAF8AMQA3ADQAXwA2AEMAAAAAAA== 
Content-Language: zh-CN 

my login page html 
+0

需要对这里的客户端系统的更多信息:在您的AD域用户使用未来加入到AD域的工作站,以及您的非域加入用户使用未加入域的工作站(如便携式计算机)?在这里玩VPN吗,还是每个人都在同一个内部网络上? –

+0

是的,域用户加入了正确的AD域,非域用户加入了另一个AD域,并且我的网络中没有VPN。这个问题看起来像铬行为,当铬找到域不匹配时,它只是返回错误。我试图将WWW-Authenticate:Anonymous添加到http标题中,不起作用。 – zhufeizzz

摆脱WWW-Authenticate: NTLM只能使用WWW-Authenticate: Negotiate在HTTP标头中。微软多年前就弃用NTLM来支持Kerberos。真的,没有人应该再使用NTLM,并怀疑你的客户是谁。这条线在您的网络跟踪意味着Chrome用户端使用NTLM:

授权:协商 TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw ==

+0

我已经从服务器响应头中删除了“WWW-Authenticate:NTLM”。现在,当我使用非域用户时,chrome会显示一个基本的身份验证对话框,我必须单击取消按钮,以便跳转到登录页面。你知道为什么吗? – zhufeizzz

+0

这是非域网络浏览器客户端在Kerberos SSO协商失败时执行的典型行为 - 弹出基本身份验证对话框。你的原始问题,集中于chrome返回一个ERR_UNEXPECTED错误页面,我们已经在技术上解决了这个问题。为了应对这种新情况,我可以用一个新的建议来编辑我的答案,但是真的,这开始进入一个扩展的讨论中,并且对于回答的人来说真的不公平。 –