オープンソース・ソリューション・テクノロジ 相本 と申します。 これは FPSP のバグだと考えています。 【原因】 filter条件が、/profile/* ですがこれは各SPからのSAML Request時にも動作し ます。 このとき、SPのEntityIDなどを保持しているセッション(_idp_authn_lc_key)が 前回の アクセス時のまま残っているため、以前のSPへのEntityIDへのアクセスとして FPSPが判定してしまいます。 【対策】 FPSPで"拒否"した際に_idp_authn_lc_keyを破棄することで事象を解消できます。 下記のようなコードを入れることで本事象を解消できることを確認しました。 HttpServletHelper.unbindLoginContext( HttpServletHelper.getStorageService(m_servletContext), m_servletContext, httpServletRequest, httpServletResponse); 【補足】 私が確認した限りですが、本来拒否されなければならないユーザーが許可となる という事象は発生しません。 認証済みの状態でも、「(1) /idp/profile/SAML2/Redirect/SSO(SAMLリクエス ト)」 → 「(2) /idp/AuthnEngine」 → 「(3) /idp/profile/SAML2/Redirect /SSO(SAMLレスポンス)」と 遷移し、(1)のfilter(FPSP)では以前のEntityIDで判定されますが、 このアクセスでSAMLリクエストを解析された結果がセッション (_idp_authn_lc_key)に入り再発行されるため (3)のアクセス時には(1)のSAMLリクエストの内容でFPSPは判定します。 よって「前回が許可」、「今回か拒否」のパターンでは 前回の内容で判定されることはありませんでした。 この事象とは別に FPSP を利用していて、もう1件バグと思われる事象が ありましたので合わせて報告します。 【事象】 FPSPで定義されたいるSPにアクセスして、Shibboleth IdPのログイン画面を表示後 Shibboleth IdPにログインしなかった場合、以降どのSPでもFPSPで拒否となる。 【再現手順】 あるSPへアクセスし、Shibboleth IdPのログイン画面が表示された後 ログインせずに別のSPへアクセスし、ログインを試みようとするもFPSPで拒否さ れる。 【原因】 Shibboleth IdPにログインされていない状態でも FPSP が動作してしまう。 【対策】 FPSPはShibboleth IdPに未ログイン状態では動作しないようにします。 下記のようなコードを入れることで本事象を解消できることを確認しました。 if (!loginCtx.isPrincipalAuthenticated()) { // まだログインしていない場合はログイン処理へ filterChain.doFilter(servletRequest, servletResponse); return; } この2件に関してのパッチを添付致します。 参考にしていただければと思います。 以上、よろしくお願い致します。 (2014年03月24日 10:22), Tatsumi Hosokawa wrote: > 慶應義塾ITC本部の細川です。 > > 現在、 > > https://meatwiki.nii.ac.jp/confluence/pages/viewpage.action?pageId=12158554 > > のFilter Per SP (FPSP)をテストしており、一応動作はするようになったのですが、 > これで属性送信を一旦拒否された場合、それ以降その他のSPにSSOする際も、 > 全て拒否されるようになってしまっています。 > > ブラウザを再起動すればまた他サービスにはログインできるのですが、 > これはそのような仕様なのでしょうか? > > 現在のSampleFilterPerSP_allow.xmlの内容は、 > > <?xml version="1.0" encoding="UTF-8"?> > <!DOCTYPE EntitiesDescriptor [ > <!ELEMENT EntitiesDescriptor (EntityDescriptor+)> > <!ELEMENT EntityDescriptor (Attribute+)> > <!ELEMENT Attribute (#PCDATA)> > > <!ATTLIST EntityDescriptor entityID CDATA #REQUIRED> > <!ATTLIST Attribute attributeID CDATA #REQUIRED> > ]> > > <EntitiesDescriptor> > <EntityDescriptor entityID="https://testsp1.itc.keio.ac.jp/shibboleth-sp"> > <Attribute attributeID="eduPersonAffiliation"> > student > </Attribute> > </EntityDescriptor> > </EntitiesDescriptor> > > となっており、 https://testsp1.itc.keio.ac.jp/ へのログインは、 > 私のeduPersonAffiliationがstaff;memberなので拒絶されます。 > > ここまではいいのですが、その後他のSPに接続する際も、 > > Deny you(xxxxxxxx@xxxxxxxxxx) login to Service Provider https://testsp1.itc.keio.ac.jp/shibboleth-sp > > のメッセージがブラウザに表示され、拒絶されてしまいます。 > ここで、testsp1.itc.keio.ac.jpにアクセスする前であれば、 > 他のサービスにも問題なくログインできます。 > > > idp-process.logには何も表示されないのですが、catalina.outには次のようなエラーが出ます。 > > 1. まず最初に https://testsp1.itc.keio.ac.jp にアクセスした時 > > SampleFilterPerSP spEntityId = https://testsp1.itc.keio.ac.jp/shibboleth-sp > SampleFilterPerSP don't match any attributes. > SampleFilterPerSP eduPersonAffiliation=member > SampleFilterPerSP eduPersonAffiliation=staff > SampleFilterPerSP eduPersonPrincipalName=xxxxxxxxxxx@xxxxxxxxxx > SampleFilterPerSP transientId=xxxxxxxxxxxx > > 2. その後 https://security-learning.nii.ac.jp にアクセスした時 > > SampleFilterPerSP spEntityId = https://testsp1.itc.keio.ac.jp/shibboleth-sp > SampleFilterPerSP don't match any attributes. > SampleFilterPerSP eduPersonAffiliation=member > SampleFilterPerSP eduPersonAffiliation=staff > SampleFilterPerSP eduPersonPrincipalName=xxxxxxxxxxx@xxxxxxxxxx > SampleFilterPerSP transientId=xxxxxxxxxxxx > > 3. ブラウザを再起動して https://security-learning.nii.ac.jp にアクセスした時(問題なくログインできます) > SampleFilterPerSP spEntityId = https://security-learning.nii.ac.jp/shibboleth-sp > SampleFilterPerSP spEntityId = https://security-learning.nii.ac.jp/shibboleth-sp > > > 1,2のエラーは全く同一です。このような状況なのですが、どなたかFPSPを利用されている方、 > これが異常な動作なのかどうか教えていただけますでしょうか? > > よろしくお願いします。 >
Attachment:
SampleFilterPerSP.zip
Description: Zip archive