2010-11-30 9 views
2

シングルサインオンを実現するために、Kerberos拡張のマイルストーン2でPOCしています。私のセットアップのドメイン外のKerberos拡張、SSO、マシン

クイック概要:
KDC:のWindows Server 2003(SP2)
Webサーバ:のUbuntu 10.04、Tomcatの5.5はJava 1.6.0_22(ないドメイン上)
春:フレームワーク3.0.5、セキュリティ3.0.4、Kerberos拡張1.0.0 M2

まず、SPNEGO認証を試み、ログインページにリダイレクトできないように設定しました。 これは、SpnegoAuthenticationProcessingFilterの "failureHandler"プロパティを設定して行います。私はこのドメインをドメイン内外の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マシンがドメイン外にある場合には、私のWebサーバがで応答のWindowsマシンが応答する に(いつもどおり)ヘッダ「WWW認証ネゴシエート」 SpnegoAuthenticationProcessingFilterは、 "Negotiate Header was invalid ..."と表示され、NTLMヘッダー( "Negotiate TlRM ...")を使用して、ログインページにユーザをリダイレクトします。すばらしいです。

問題:
このウェブアプリを使用する必要がありますドメイン外永久にあるMacとLinuxのマシンの数があります。 ウェブアプリケーション(Firefox 3.6)を起動すると、私のWebサーバーは、"WWW-Authenticate Negotiate"ヘッダーに応答して、 クライアントにウェブアプリケーションがKerberos化していると通知しますが、MacまたはLinuxマシンはまったく応答しません。したがって、SpnegoAuthenticationProcessingFilter が再び入力されることはなく、したがって失敗もなく、その後ログインページへのリダイレクトも行われません。

質問:
なぜMacとLinuxのマシンがWindowsマシン(私はちょうどそれを尋ね信じてすることはできません...)と同じように応答しませんか?

私は、MacとLinuxのマシンが(kinit経由で)チケットを取得したときに認証を受けることができることを知っていますが、これは良い解決策のようには思われません チケットも有効期限が切れます。

Windowsマシンと同じように、これらのマシンにNTLMヘッダーを返す方法はありますか? 他の提案や方法がある場合は、お知らせください。

b.w. MacとLinuxマシンでテストするために私が使ったFirefoxを設定しました("network.negotiate-auth.delegation-uris""network.negotiate-auth。は ".corpza.corp.co.za"に設定されました)

答えて

0

あなたは間違った道を進んでいる。失敗SPNEGOフィルターに依存しないでください。LinuxおよびMacクライアントは、Windowsクライアントと同じように正常に動作します。一般的なセットアップが見えるはずです次のように、フィルタが実装/サポートしていない場合、バグが見つかりました。

サーバー(またはネゴシエートの任意の組み合わせ、基本、ダイジェスト)から:「ネゴシエート401 WWW認証」は
  1. クライアントは
  2. クライアントが受信するサーバーにリクエストを送信します。
  3. クライアントは認証データを提供しようとしますが、失敗した場合は401ページが表示されます。

Windowsクライアントから送信されたフォールト/ノンプロセッシングデータを使用してフォームを表示します。すべてのクライアントに適切なログイン方法(SPNEGOまたはフォーム、つまりフェイルスルー)を選択できるようにするには、フォームを401と直接送信する必要があります。フォームの認証は、Negotiate、Digest、BasicなどのHTTP認証ではないことに注意してください。それは異なって扱われなければならない。

私たちもこのフィルタを使用しています。私は本当にそれに満足していません。だから私は実践的な経験があります。

関連する問題