Я выполняю POC'ing с этапом 2 расширения Kerberos для достижения единого входа.
Краткий обзор моей настройки:
KDC: Windows Server 2003 (SP2)
Веб-сервер: Ubuntu 10.04,Tomcat 5.5, Java 1.6.0_22 (не в домене)
Spring: Framework 3.0.5, безопасность 3.0.4, расширение Kerberos 1.0.0 M2
У меня есть настройкаКонфигурация для первой попытки аутентификации SPNEGO, а в случае неудачи - перенаправление на страницу входа.Это можно сделать, установив свойство SpnegoAuthenticationProcessingFilter * faultHandler.Я успешно проверил это на компьютерах с Windows (XP и 7), которые входят и выходят из домена.Машины, находящиеся вне домена, перенаправляются на страницу входа и затем могут успешно войти в систему.
Вот мой конфиг:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<http entry-point-ref="spnegoEntryPoint" auto-config="false">
<intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/j_spring_security_check*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" />
<custom-filter ref="spnegoAuthenticationProcessingFilter" position="BASIC_AUTH_FILTER" />
<form-login login-page="/login.html" default-target-url="/" always-use-default-target="true"/>
</http>
<authentication-manager alias="authenticationManager">
<authentication-provider ref="kerberosServiceAuthenticationProvider" />
<authentication-provider ref="kerberosAuthenticationProvider"/>
</authentication-manager>
<beans:bean id="spnegoEntryPoint"
class="org.springframework.security.extensions.kerberos.web.SpnegoEntryPoint" />
<beans:bean id="spnegoAuthenticationProcessingFilter"
class="org.springframework.security.extensions.kerberos.web.SpnegoAuthenticationProcessingFilter">
<beans:property name="failureHandler">
<beans:bean class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
<beans:property name="defaultFailureUrl" value="/login.html" />
<beans:property name="allowSessionCreation" value="true"/>
</beans:bean>
</beans:property>
<beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>
<beans:bean id="kerberosServiceAuthenticationProvider"
class="org.springframework.security.extensions.kerberos.KerberosServiceAuthenticationProvider">
<beans:property name="ticketValidator">
<beans:bean
class="org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator">
<beans:property name="servicePrincipal" value="HTTP/mywebserver.corpza.corp.co.za"/>
<beans:property name="keyTabLocation" value="classpath:mywebserver.keytab" />
<beans:property name="debug" value="true"/>
</beans:bean>
</beans:property>
<beans:property name="userDetailsService" ref="dummyUserDetailsService" />
</beans:bean>
<beans:bean id="kerberosAuthenticationProvider" class="org.springframework.security.extensions.kerberos.KerberosAuthenticationProvider">
<beans:property name="kerberosClient">
<beans:bean class="org.springframework.security.extensions.kerberos.SunJaasKerberosClient">
<beans:property name="debug" value="true" />
</beans:bean>
</beans:property>
<beans:property name="userDetailsService" ref="dummyUserDetailsService" />
</beans:bean>
<beans:bean class="org.springframework.security.extensions.kerberos.GlobalSunJaasKerberosConfig">
<beans:property name="debug" value="true" />
<beans:property name="krbConfLocation" value="/etc/krb5.conf" />
</beans:bean>
<beans:bean id="dummyUserDetailsService" class="main.server.DummyUserDetailsService"/>
</beans:beans>
Когда машина Windows находится за пределами домена, мой веб-сервер отвечает Заголовок "WWW-Authenticate Negotiate " (как обычно), на который машина Windows отвечает заголовком NTLM ("Negotiate TlRM ..."), где SpnegoAuthenticationProcessingFilter затем говорит«Заголовок согласования был недействительным ...» и неожиданно перенаправляет пользователя на страницу входа.Отлично.
Проблема:
Существует ряд компьютеров Mac и Linux, которые постоянно находятся за пределами домена и могут использовать это веб-приложение.Когда они запускают веб-приложение (с Firefox 3.6), мой веб-сервер отвечает ожидаемым заголовком "WWW-Authenticate Negotiate" , чтобы сообщить клиенту, что веб-приложение Kerberized, НО ни машины Mac, ни Linux не отвечаютсовсем.Таким образом, SpnegoAuthenticationProcessingFilter не вводится снова и, следовательно, не происходит сбоев и, следовательно, перенаправление на страницу входа не происходит.
Вопрос:
Почему немашины Mac и Linux реагируют так же, как машины Windows (не могу поверить, я только что спросил ...)?
Я знаю, что когда машины Mac и Linux получают билет (черезkinit) они могут проходить проверку подлинности, но это совсем не похоже на хорошее решение, поскольку от пользователя требуется приложить усилия для предоставления учетных данных и т. д., где также истекает срок действия билетов.
Так есть ли способ, которыммы можем заставить эти машины отправлять обратно заголовок NTLM, как это делают машины Windows?Или, если есть какие-либо другие предложения / способы, пожалуйста, сообщите мне.
Кстати, я настроил Firefox, которые я использовал для тестирования на компьютерах Mac и Linux ( "network.negotiate-auth.delegation-uris " и " network.negotiate-auth.trusted-uris " было установлено в" .corpza.corp.co.za ").