我有一个配置有Kerberos的Spring App,对于加入AD域的用户来说,它运行良好。还有其他用户可以访问域外的应用程序,因此Kerberos无法使用,因此应提示他们输入用户名和密码(HTML表单)。
如果发现在某些情况下(取决于浏览器),此过程将失败,并显示 GSSException:检测到有缺陷的令牌(机制级别:GSSHeader找不到正确的标记)。
似乎浏览器无法使用kerberos(这是可以的,因为用户未加入域),并尝试将NTLM令牌发送到App。(SpnegoAuthenticationProcessingFilter:149-协商标头无效:协商TlRMTVNTUAABAAAAAAA4l4II4gAAAAAAAAAAAAAAAAAAGAbEdAAAADw = =)(无法识别为Kerberos有效令牌),因此它会失败,并出现GSSException。
Internet(here,here和here)中有很多关于此问题的参考,其中大多数建议解决kerberos问题,但是在我的情况下,这是不是kerberos问题,因为有些用户未加入域。
那么,有什么方法可以迫使kerberos退回html表单,而不是发送NTLM令牌?
这是我在spring-security.xml上的配置块
<http entry-point-ref="spnegoEntryPoint" use-expressions="true">
<intercept-url pattern="/logout" access="permitAll"/>
<intercept-url pattern="/login" access="permitAll"/>
<intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
<form-login login-page="/login"/>
<custom-filter ref="spnegoAuthenticationProcessingFilter" before="BASIC_AUTH_FILTER" />
<csrf disabled="true"/>
</http>