ADFSをIDPとして使用し、アプリケーションはSPとして機能します。以下はAuthレスポンスのサンプルです。
<?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 時間経過したら、ユーザーをローカルでログアウトします。サーバー セッションの有効期限は、デフォルト値の 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 つの 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
この例外がなぜ発生するのか分かりません。
概念を理解するのを手伝ってください。
ありがとう!
ベストアンサー1
IDP は、ユーザーが以前に認証した情報 (Authentication Instant によって識別された時間) を再利用しており、Spring SAML はデフォルトで、ユーザーが 7200 秒以上前に認証されている場合はログインできないように構成されています。
これはセキュリティ対策です。コンピュータがユーザーを認証してからかなり時間が経っている場合、コンピュータを操作しているのがまだ同じ人物であることを保証するのは困難です。Spring SAML では、たとえばこれを構成可能にするなどして、許容されるセキュリティ レベルを構成する手段がいくつか用意されています。
maxAuthenticationAge
Beanのプロパティを設定することでこの値を増やすことができますWebSSOProfileConsumerImpl
。
オーディエンス エラーは、アサーションにオーディエンス要素が含まれており、そのいずれもアプリケーションのエンティティ ID と一致しない場合にのみ発生します。質問のレスポンスがこのエラーを引き起こしているわけではないと思います。