私はSpringSAML Extensionをアプリケーション内に統合し、SSO用にクライアントのADFS2.0の1つをIDPとして統合することに取り組んでいます。アプリケーションからサービスプロバイダーのメタデータを生成し、ADFSメタデータをアプリケーションにインポートしました。クライアントのidpを選択すると[シングルサインオンの開始]をクリックして、SAML応答が表示されている適切なクライアントの資格情報を次のように指定します。
SamlResponse。
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"
Destination="https://sso.spire2grow.com:8443/<our application>/saml/SSO" ID="_d7fa7cb7-a858-4d4e-aa4c-bf7a5d11e485"
InResponseTo="a2icei36d347di68gi33534cc13fd1" IssueInstant="2014-09-30T14:17:21.819Z" Version="2.0"><Issuer
xmlns="urn:oasis:names:tc:SAML:2.0:assertion"><Clients ADFS trust services URL></Issuer><samlp:Status><samlp:StatusCode
Value="urn:oasis:names:tc:SAML:2.0:status:Responder"></samlp:StatusCode></samlp:Status></samlp:Response>
しかし、サービスプロバイダーがメッセージを検証できないため、次の例外がスローされています。
例外メッセージ:
[351545]2014-09-30 19:47:21,714 DEBUG - SAML message intended destination endpoint matched recipient endpoint
[351545]2014-09-30 19:47:21,714 DEBUG - Authentication attempt using org.springframework.security.saml.SAMLAuthenticationProvider
[351545]2014-09-30 19:47:21,715 DEBUG - Error validating SAML message
org.opensaml.common.SAMLException: Response has invalid status code urn:oasis:names:tc:SAML:2.0:status:Responder, status message is null
at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.Java:113)
at org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.Java:82)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.Java:156)
at org.springframework.security.saml.SAMLProcessingFilter.attemptAuthentication(SAMLProcessingFilter.Java:84)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.Java:195)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.Java:342)
私がここで何かを見逃しているなら、誰かが指摘してくれませんか。
更新:
この質問に対する回答を見た後、ADFSから次のエラーが表示されました。
Microsoft.IdentityServer.Protocols.Saml.SamlProtocolSignatureAlgorithmMismatchException: MSIS7093: The message is not signed with expected signature algorithm. Message is signed with signature algorithm http://www.w3.org/2000/09/xmldsig#rsa-sha1. Expected signature algorithm http://www.w3.org/2001/04/xmldsig-more#rsa-sha256. at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolManager.ValidateSignatureRequirements(SamlMessage samlMessage) at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolManager.Issue(HttpSamlRequestMessage httpSamlRequestMessage, SecurityTokenElement onBehalfOf, String sessionState, String relayState, String& newSamlSession, String& samlpAuthenticationProvider, Boolean isUrlTranslationNeeded, WrappedHttpListenerContext context, Boolean isKmsiRequested)
しかし、これを見た後、依存する信頼関係者の署名アルゴリズムをrsa-sha256に変更しましたが、それでも同じメッセージが表示されます。
Rsa-sha256の正規の証明書が必要ですか?自己署名証明書は正しく機能しますか?
ADFSからの例外は、SAMLメッセージが期待するRSA-SHA256ではなく、RSA-SHA1で署名されていることを示しています。
ADFSでのSpringSAMLのリレーパーティの署名アルゴリズムをSHA-1に設定してください。詳細については、 http://docs.spring.io/autorepo/docs/spring-security-saml/1.0.x-SNAPSHOT/reference/htmlsingle/#chapter-idp-guide)の最後の箇条書きを参照してください。 -adfs-sp
Value = "urn:oasis:names:tc:SAML:2.0:status:Responder"
SAMLコア仕様を参照してください。それは言う:
urn:oasis:names:tc:SAML:2.0:status:Responder SAMLレスポンダーまたはSAML権限の側でエラーが発生したため、要求を実行できませんでした。
つまり、ADFSサーバーで要求の解釈または応答に問題がありました。 IdPは、問題が何であるかを教えてくれるはずです。
Spring Security SAML拡張機能は、defualtによるSHA-256をサポートしていません。 org.springframework.security.saml.SAMLBootstrap
クラスを拡張して、SHA-256を提供できます。
postProcessBeanFactory
メソッドをオーバーライドします
public class Bootstrap extends SAMLBootstrap {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
super.postProcessBeanFactory(beanFactory);
BasicSecurityConfiguration config = (BasicSecurityConfiguration) Configuration
.getGlobalSecurityConfiguration();
config.registerSignatureAlgorithmURI("RSA", SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA256);
config.setSignatureReferenceDigestMethod(SignatureConstants.ALGO_ID_DIGEST_SHA256);
}