web-dev-qa-db-ja.com

IDPが開始したSAMLログインエラー-認証ステートメントが古すぎて値と一緒に使用できません

ADFSをIDPとして使用しており、アプリケーションはSPとして機能します。以下は認証応答のサンプルです

<?xml version="1.0" encoding="UTF-8"?>
<Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="_82062d3d-897f-473e-90ad-0bb351d63b22" IssueInstant="2015-04-29T20:39:17.240Z" Version="2.0">
   <Issuer>http://adfs/services/trust</Issuer>
   <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
      <ds:SignedInfo>
         <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
         <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
         <ds:Reference URI="#_82062d3d-897f-473e-90ad-0bb351d63b22">
            <ds:Transforms>
               <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
               <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <ds:DigestValue />
         </ds:Reference>
      </ds:SignedInfo>
      <ds:SignatureValue />
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
         <ds:X509Data>
            <ds:X509Certificate>certificate..... </ds:X509Certificate>
         </ds:X509Data>
      </KeyInfo>
   </ds:Signature>
   <Subject>
      <NameID>username</NameID>
      <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
         <SubjectConfirmationData InResponseTo="923ki0eg8h7g7y2243fi9jbdd1977j9" NotOnOrAfter="2015-04-29T20:44:17.240Z" Recipient="https://localhost/saml/SSO" />
      </SubjectConfirmation>
   </Subject>
   <Conditions NotBefore="2015-04-29T20:39:17.240Z" NotOnOrAfter="2015-04-29T21:39:17.240Z">
      <AudienceRestriction>
         <Audience>https://localhost/saml/metadata</Audience>
      </AudienceRestriction>
   </Conditions>
   <AuthnStatement AuthnInstant="2015-04-29T20:39:17.162Z" SessionIndex="_92062g3d-897f-473e-90ad-0aa351d63b22">
      <AuthnContext>
         <AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</AuthnContextClassRef>
      </AuthnContext>
   </AuthnStatement>
</Assertion>

私が直面している問題は、次の2つのシナリオに分類できます。

  1. 1時間のアイドル時間の後、ユーザーをローカルでログアウトします。サーバーセッションの有効期限はデフォルト値の30分です。ユーザーが積極的に何かに取り組んでいる場合、10分ごとにハートビートpingを送信するコードがあります。さて、問題は、ユーザーが1時間のセッション満了後にログインしようとすると、以下の例外が発生することです。

    Caused by: org.springframework.security.authentication.CredentialsExpiredException: Authentication statement is too old to be used with value 2015-05-28T17:41:52.648Z
        at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.verifyAuthenticationStatement(WebSSOProfileConsumerImpl.Java:538)
        at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.verifyAssertion(WebSSOProfileConsumerImpl.Java:306)
        at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.Java:214)
        ... 77 more
    

ここでの質問は..なぜ私たちのアプリケーションはトークンが発行されたときのインスタンスを検証しようとするのでしょうか?いつでも付与できます。

  1. 「ローカルエンティティは、少なくとも1つのAudienceRestrictionのアサーションの対象ユーザーではありません」というメッセージとともにSAMLExceptionが発生し続けます。トレースは以下の通りです

    Caused by: org.opensaml.common.SAMLException: Local entity is not the intended audience of the assertion in at least one AudienceRestriction
        at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.verifyAudience(WebSSOProfileConsumerImpl.Java:506)
        at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.verifyAssertionConditions(WebSSOProfileConsumerImpl.Java:458)
        at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.verifyAssertion(WebSSOProfileConsumerImpl.Java:303)
        at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.Java:214)
        ... 77 more
    

この例外が発生する理由がわかりません。

概念を理解するのを手伝ってください。

ありがとう!

13
rakpan

IDPは、ユーザーが以前に認証した情報(Authentication Instantによって識別された時点)を再利用しています。SpringSAMLは、デフォルトで、ユーザーが7200秒以上前に認証された場合にユーザーがログインできないように構成されています。

これはセキュリティ対策です。コンピュータがユーザーを認証してからかなり前のことである場合、それがまだコンピュータを操作しているのと同じ人物であることを保証することは困難です。 Spring SAMLは、たとえばこれを構成可能にすることによって、許容できるセキュリティのレベルを構成するためのいくつかの手段を提供します。

maxAuthenticationAgeBeanにプロパティWebSSOProfileConsumerImplを設定することで、この値を増やすことができます。

オーディエンスエラーは、アサーションにオーディエンス要素が含まれていて、それらのいずれもアプリケーションのエンティティIDと一致しない場合にのみ発生するはずです。あなたの質問の回答がこのエラーを引き起こしているとは思いませんか?

31

このトピックに関する参考までに、Googleは現在SAMLリダイレクトのforceAuthNフラグを尊重していないことを確認しています。その結果、SAMLトークンの認証タイムアウトに関する問題が発生しています。ここに記載されています: Google Apps SSO as IdP into Spring SAML2-認証トークンのタイムアウト

2
Ed Newman