싱글 사인온 (SSO)을 달성하기 위해 Kerberos 확장의 마일스톤 2를 POC 처리했습니다.스프링 Kerberos 확장, SSO 및 도메인 외부의 머신
내 설치의 빠른 요약 :
KDC : 윈도우 서버 2003 (SP2)
웹 서버 : 우분투 10.04, 톰캣 5.5, 자바 1.6.0_22
(안 도메인) 스프링 : Framework 3.0.5, 보안 3.0.4, Kerberos 확장 1.0.0 M2
SPNEGO 인증을 먼저 시도하고 로그인 페이지로 리디렉션하지 못하면 구성을 설정했습니다. SpnegoAuthenticationProcessingFilter의 "failureHandler"속성을 설정하면됩니다. 도메인 안팎에있는 Windows 컴퓨터 (XP 및 7)에서 성공적으로이 을 테스트했습니다. 도메인 외부에있는 시스템은 로그인 페이지 으로 리디렉션 된 다음 성공적으로 로그인 할 수 있습니다. Windows 시스템 내 웹 서버가 윈도우 머신에 응답하는 (평소에 따라) 헤더 " 협상 WWW 인증"는 응답 도메인 외부의 경우
<?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>
:
여기 내 설정이다 SpnegoAuthenticationProcessingFilter에 "Negotiate Header was invalid ..."라고 표시된 NTLM 헤더 ("협상 TlRM ...")가있는 경우 및 awesomly 사용자를 로그인 페이지로 리디렉션합니다. 큰.
시트 문제점 :이 웹 응용 프로그램을 사용할 필요가 도메인 외부 영구적입니다 Mac 및 Linux 시스템의 숫자가 있습니다
. 웹 응용 프로그램 (Firefox 3.6)을 방문했을 때 내 웹 서버는 "WWW-Authenticate Negotiate" 헤더를 사용하여 클라이언트에 웹 응용 프로그램이 Kerberos임을 알리지 만 Mac 또는 Linux 컴퓨터는 전혀 응답하지 않습니다 . 따라서 SpnegoAuthenticationProcessingFilter 이 다시 입력되지 않으므로 오류가 발생하지 않으며 로그인 페이지로 리디렉션되지 않습니다. (난 그냥 물어 보라 수 없습니다 ...) 왜 Mac 및 Linux 컴퓨터는 Windows 시스템과 동일한 방식으로 응답하지 않습니다
:
문제는?
나는 맥과 리눅스 기계가 (kinit을 통해) 티켓을 얻었을 때 인증을 할 수 있지만, 좋은 해결책이 아닌 것 같다. 사용자가 신임장을 제공하는 노력을 필요로하기 때문에. 티켓도 만료됩니다.
그래서 Windows 머신처럼 NTLM 헤더를 다시 전송할 수있는 방법이 있습니까? 다른 제안/방법이 있으면 알려 주시기 바랍니다.
b.w. 맥과 리눅스 머신 ("network.negotiate-auth.delegation-uris"과 "network.negotiate-auth"에서 테스트하기 위해 사용했던 Firefox를 설정했다.trusted-uris "이".corpza.corp.co.za "로 설정되었습니다.)