Spring SAMLを使用したアプリケーションがあります私たちはSSOCircleに対してlocalhostで動作するSPとして設定しました。私たちは現在、顧客のテスト環境に展開しており、顧客のIDPと連携するよう努めています。
IDPにメタデータを渡し、 http://myapp-test.acme.com:8080/myapp/saml/SSO
ために http://localhost:8080/myapp/saml/SSO
.
認証後、ログに次のように表示されます。
o.s.s.m.MetadataGeneratorFilter - 生成されたデフォルトエンティティのベースURL http://someappserver.acme.com:8080/myapp
最初のサーバー要求の値に基づいています。
org.opensaml.common.SAMLException:目的の宛先
http://myapp-test.acme.com:8080/myapp/saml/SSO
oasis:names:tc:SAML:2.0:profiles:SSO:browserこれは、プロファイルurnのエンドポイントURLに一致しません。
ブラウザウィンドウでは、リクエストが http://someappserver.acme.com:8080/myapp/saml/SSO
.
そう http://myapp-test.acme.com:8080/myapp/saml/SSO
解決する
http://someappserver.acme.com:8080/myapp/saml/SSO
これを処理するためにコード/設定を変更するにはどうすればよいですか?私は、アプリケーションサーバーにメタデータをハードコードする必要はないと思っています。
回答:
回答№1の場合は3サービスプロバイダメタデータのURLは、サービスプロバイダがIDPからSAMLメッセージを受信した実際のURLに対応する必要があります。この場合、2つは異なる。
あなたはあなたの securityContext.xml
豆を変えて metadataGeneratorFilter
財産を提供することによって entityBaseURL
正しいURLを使用してください(例:
<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
<property name="entityBaseURL" value="http://myapp-test.acme.com:8080/myapp"/>
</bean>
</constructor-arg>
</bean>
このプロパティを設定しないと、Spring SAMLでは entityBaseURL
最初のメタデータに基づいてメタデータを生成しますそれを受け取るよう要求する。あなたのアプリケーションが複数のURLで利用可能な場合、IDPが実際にメッセージを送信するURLとは異なるURLになります。
内部URLがアプリケーションサーバーが(あなたのDNS解決の場合のように)呼び出し元が使用したURLと異なる場合、Spring SAMLはBeanを変更することによって特定のパブリックURLの背後に展開されていると考えるように強制できます contextProvider
に:
<bean id="contextProvider" class="org.springframework.security.saml.context.SAMLContextProviderLB">
<property name="scheme" value="http"/>
<property name="serverName" value="myapp-test.acme.com"/>
<property name="serverPort" value="8080"/>
<property name="includeServerPortInRequestURL" value="true"/>
<property name="contextPath" value="/myapp"/>
</bean>
Spring SAMLマニュアルの章で詳細を見つけることができます 逆プロキシとロードバランサ.