日本アイ・ビー・エム システムズ・エンジニアリング株式会社
WAS V8.5.5 SAML Web SSO 構成ガイド
© 2016 IBM Corporation
Disclaimer
この資料は日本アイ・ビー・エム株式会社ならびに日本アイ・ビー・エム システムズ・エンジニアリング株式会社の正式なレビュー
を受けておりません。
当資料は、資料内で説明されている製品の仕様を保証するものではありません。
資料の内容には正確を期するよう注意しておりますが、この資料の内容は2015年12月現在の情報であり、製品の新しいリ
リース、PTFなどによって動作、仕様が変わる可能性があるのでご注意下さい。
今後国内で提供されるリリース情報は、対応する発表レターなどでご確認ください。
IBM、IBMロゴおよびibm.comは、世界の多くの国で登録されたInternational Business Machines
Corporationの商標です。他の製品名およびサービス名等は、それぞれIBMまたは各社の商標である場合があります。現
時点でのIBMの商標リストについては、www.ibm.com/legal/copytrade.shtmlをご覧ください。
当資料をコピー等で複製することは、日本アイ・ビー・エム株式会社ならびに日本アイ・ビー・エム システムズ・エンジニアリング株
式会社の承諾なしではできません。
当資料に記載された製品名または会社名はそれぞれの各社の商標または登録商標です。
JavaおよびすべてのJava関連の商標およびロゴは Oracleやその関連会社の米国およびその他の国における商標または登録
商標です。
Microsoft, Windows および Windowsロゴは、Microsoft Corporationの米国およびその他の国における商標です。
Linuxは、Linus Torvaldsの米国およびその他の国における登録商標です。
UNIXはThe Open Groupの米国およびその他の国における登録商標です。
目次
1. はじめに
2. Liberrtyプロファイル環境の確認
3. eclipse/WDT環境の確認
4. Liberty SAML Web SSO構成の前提
5. samlWeb-2.0フィーチャーの追加
6. SamlWebSso20要素~AuthFilter要素の追加
7. KeyStore要素の追加
8. WebApplication要素~application-bnd要素~security-role要素~special-subject要素の追加
9. server.xmlの一例
10.(Webアプリケーション側作業)web.xmlの編集
11. SPメタデータのエクスポート
12. 環境確認作業
13. 参考
14. SAMLテスト用サンプル・サーブレット・コード
© 2016 IBM Corporation
1. はじめに
SAMLの概要については、「WAS V8.5.5 SAML認証構成ガイド(WAS Full Profile版)」を参照
Libertyプロファイルでは、SAML仕様で定義される2種類の処理フロー(IdP Initiated SSOとSP-Initiated
SSO)の両方が利用可能である。
【参考】 SAML 2.0 Web Browser Single-Sign-On
http://www-01.ibm.com/support/knowledgecenter/api/content/nl/ja-jp/SSD28V_8.5.5/com.ibm.websphere.wlp.core.doc/ae/cwlp_saml_web_sso.html
2.1 Libertyプロファイル環境の確認
Libertyプロファイルのエディションは問わない。
バージョンは、V8.5.5.7(FixPack7)以上が必要。以下のコマンドで確認する。
– productInfo.sh/.bat version
– 実行例
前提として、samlWeb-2.0フィーチャーが必要。以下のコマンドで確認する。
– productInfo.sh/.bat featureInfo
– 実行例
© 2016 IBM Corporation
2.2 Libertyプロファイル環境の確認
もし、samlWeb-2.0フィーチャーがないときには以下の手順でインストールする。
– 接続先リポジトリーに、samlWeb-2.0があることを、以下のコマンドで確認する。
– featureManager.sh/.bat find samlWeb-2.0
• 出力内容に、samlWeb-2.0が含まれていればOK。
– 接続先リポジトリーから、samlWeb-2.0をインストールする。以下のコマンドで実行する。
– featureManager.sh/bat install samlWeb-2.0
– 実行例
2.3 Libertyプロファイル環境の確認
samlWeb-2.0フィーチャーをインストール後に、結果を確認する。以下のコマンドで確認する。
– productInfo.sh/.bat featureInfo
– 実行例
© 2016 IBM Corporation
3. eclipse/WDT環境の確認
Libertyプロファイルの構成には、eclipse/WDT環境があることが望ましい。
eclipse (JavaEE IDE)およbWDTのインストール手順については、以下リンク先を参照。
【参考】新卒関西人のWebSphere挑戦記: ① ~WAS Libertyプロファイルの導入~
– http://www.ibm.com/developerworks/jp/websphere/library/was/liberty_intro/1.html
WDTのバージョンもV8.5.5.7以上である必要がある。以下の方法で確認する。
– Help>About Eclipseでパネルを開き、WDTアイコンをクリックする。バージョンを確認する。
4. Liberty SAML SSO構成の前提
IdPが適切に構成され、ユーザーが定義されていること。
IdPからエクスポートされたメタデータ・ファイル(idpMetadata.xml)が入手できていること。
SP側で利用するWebアプリケーションのweb.xmlの編集が可能であること。
© 2016 IBM Corporation
WDT上でserver.xmlを開き、フィーチャー・マネージャーの「Add」をクリックする
– 「Design」タブを選択する。
「Add Features」パネルのフィルターで「saml」と入力し、「samlWeb-2.0」を選択する。
– 「OK」をクリックして、フィーチャー・マネージャーに追加する。
5.1 samlWeb-2.0フィーチャーの追加
10 フィーチャー・マネージャーに「samlWeb-2.0」が追加されたのを確認する。
5.2 samlWeb-2.0フィーチャーの追加
© 2016 IBM Corporation
server.xmlで「Server Configuration」を選択して、「Add」をクリックする。
「Add Element」パネルで、フィルターに「saml」と入力し、「SAMLWeb SSO 2.0認証」を選択する。
6.1 SAML Web SS0 2.0認証(samlWebSso20)要素の追加
「Server Configuration」に「SAML Web SSO 2.0認証」が追加されたことを確認する。
必要に応じて、その属性値を変更する。(右図)
6.2 SAML Web SS0 2.0認証(samlWebSso20)要素の追加
詳細については以下リンク先(KnowledgeCenter)を参照のこと。
http://www-01.ibm.com/support/knowledgecenter/api/content/nl/ja-© 2016 IBM Corporation
必要に応じて、「SAML Web SSO 2.0認証」の設定値を変更する。
一般的に、以下の項目は設定が必要である。
– IdPメタデータ・ファイル
IdPからエクスポートしたidpMetadata.xml
の置き場を指定する。
– このファイルの一例を6.5に示す。
他の項目は必要に応じて設定する。
– Libertyでは設定しないパラメータは
内部のデフォルト値が有効になる
– SamlWebSso20での設定項目を6.4に示す
(英文、KnowledgeCenterから引用)
6.3 SAML Web SS0 2.0認証(samlWebSso20)要素の追加
14
詳細については以下リンク先(KnowledgeCenter)を参照のこと。
http://www-01.ibm.com/support/knowledgecenter/api/content/nl/ja-jp/SSD28V_8.5.5/com.ibm.websphere.wlp.core.doc/ae/rwlp_config_sa
mlWebSso20.html
6.3 補足(SamlWebSso20で設定可能な項目一覧)1/4
© 2016 IBM Corporation
6.3 補足(SamlWebSso20で設定可能な項目一覧)2/4
© 2016 IBM Corporation
6.3 補足(SamlWebSso20で設定可能な項目一覧)4/4
6.4 IdPメタデータ・ファイル(idpMetadata.xml)の一例
<?xml version="1.0" encoding="UTF-8"?><md:EntityDescriptor entityID="https://idp.ise.com:444/was/sps/WASSAML/saml20" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"><md:IDPSSODescriptor WantAuthnRequestsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"><md:KeyDescriptor use="signing"><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><X509Data><X509Certificate>MIICBzCCAXCgAwIBAgIEQH26vjANBgkqhkiG9w0BAQQFADBIMQswCQYDVQQGEwJVUzEPMA0GA1UE ChMGVGl2b2xpMQ4wDAYDVQQLEwVUQU1lQjEYMBYGA1UEAxMPZmltZGVtby5pYm0uY29tMB4XDTA0MDQxNDIyMjcxMFoXDTE3MTIyMjIyMjcxMFowSDELMAkGA1UEBhMCVVMxDzANBg NVBAoTBlRpdm9saTEOMAwGA1UECxMFVEFNZUIxGDAWBgNVBAMTD2ZpbWRlbW8uaWJtLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAiZ0D1X6rk8+ZwNBTVZt7C85m421 a8A52Ksjw40t+jNvbLYDp/W66AMMYD7rB5qgniZ5K1p9W8ivM9WbPxc2u/60tFPg0e/Q/r/fxegW1K1umnay+5MaUvN3p4XUCRrfg79OvurvXQ7GZa1/wOp5vBIdXzg6i9CVAqL29JGi6GYUC AwEAATANBgkqhkiG9w0BAQQFAAOBgQBXiAhxm91I4m+g3YX+dyGc352TSKO8HvAIBkHHFFwIkzhNgO+zLhxg5UMkOg12X9ucW7leZ1IB0Z6+JXBrXIWmU3UPum+QxmlaE0OG9zhp9L EfzsE5+ff+7XpS0wpJklY6c+cqHj4aTGfOhSE6u7BLdI26cZNdzxdhikBMZPgdyQ==</X509Certificate></X509Data></KeyInfo></md:KeyDescriptor><md:KeyDescriptor use="encryption"><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><X509Data><X509Certificate>MIICBzCCAXCgAwIBAgIEQH26vjANBgkqhkiG9w0BAQQFADBIMQswCQYDVQQGEwJVUzEPMA0GA1UE ChMGVGl2b2xpMQ4wDAYDVQQLEwVUQU1lQjEYMBYGA1UEAxMPZmltZGVtby5pYm0uY29tMB4XDTA0MDQxNDIyMjcxMFoXDTE3MTIyMjIyMjcxMFowSDELMAkGA1UEBhMCVVMxDzANBg NVBAoTBlRpdm9saTEOMAwGA1UECxMFVEFNZUIxGDAWBgNVBAMTD2ZpbWRlbW8uaWJtLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAiZ0D1X6rk8+ZwNBTVZt7C85m421 a8A52Ksjw40t+jNvbLYDp/W66AMMYD7rB5qgniZ5K1p9W8ivM9WbPxc2u/60tFPg0e/Q/r/fxegW1K1umnay+5MaUvN3p4XUCRrfg79OvurvXQ7GZa1/wOp5vBIdXzg6i9CVAqL29JGi6GYUC AwEAATANBgkqhkiG9w0BAQQFAAOBgQBXiAhxm91I4m+g3YX+dyGc352TSKO8HvAIBkHHFFwIkzhNgO+zLhxg5UMkOg12X9ucW7leZ1IB0Z6+JXBrXIWmU3UPum+QxmlaE0OG9zhp9L EfzsE5+ff+7XpS0wpJklY6c+cqHj4aTGfOhSE6u7BLdI26cZNdzxdhikBMZPgdyQ==</X509Certificate></X509Data></KeyInfo><md:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/></md:KeyDescriptor><md:ArtifactResolutionService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP"
Location="https://idp.ise.com:444/was/sps/WASSAML/saml20/soap" index="0" isDefault="true"/><md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://idp.ise.com:444/was/sps/WASSAML/saml20/slo"/><md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location="https://idp.ise.com:444/was/sps/WASSAML/saml20/slo"/><md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://idp.ise.com:444/was/sps/WASSAML/saml20/soap"/><md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid- format:persistent</md:NameIDFormat><md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid- format:transient</md:NameIDFormat><md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid- format:emailAddress</md:NameIDFormat><md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:encrypted</md:NameIDFormat><md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat><md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://idp.ise.com:444/was/sps/WASSAML/saml20/login"/><md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://idp.ise.com:444/was/sps/WASSAML/saml20/login"/></md:IDPSSODescriptor><md:Organization><md:OrganizationName xml:lang="ja">ISE</md:OrganizationName><md:OrganizationDisplayName xml:lang="ja">ISE</md:OrganizationDisplayName><md:OrganizationURL xml:lang="ja"/></md:Organization><md:ContactPerson contactType="technical"><md:Company>ISE</md:Company><md:GivenName/><md:SurName/><md:EmailAddress/><md:TelephoneNumber/></md:ContactPerson></md:Enti tyDescriptor>
© 2016 IBM Corporation
必須ではないが、一例として、SAML SSO認証で保護するURLを設定する手順を示す。
server.xmlで「SAML Web SSO 2.0認証」を選
択し、「Add」をクリックする。(右図)
「Add Element」パネルで「認証フィルター参照」を
選択し、「OK」をクリックする。(下図)
「認証フィルター参照」を選択し、「Add」をクリックする。
(右図)
6.5 認証フィルター参照(AuthFilter)要素の追加
20 「Add Element」パネルで「要求URL」を選択する。(右図)
「要求URL」の設定値として、「URLパターン」と「マッチング・タイプ」
を設定する。
© 2016 IBM Corporation
server.xmlで「Server Configuration」を選択して、「Add」をクリックする。
「Add Element」パネルで、フィルターに「key」と入力し、「鍵ストア」を選択する。
7.1 鍵ストア(KeyStore)要素の追加
「Server Configuration」に「鍵ストア」が追加されたことを確認する。
パスワード(右図)を入力しCtrl+Sで保管する。
ロケーション(右図)の場所にkey.jksファイル
が自動的に生成されるので、確認する。
© 2016 IBM Corporation
Eclipse/WDT上でWebアプリケーションをLibertyサーバーに追加すると、 server.xmlに自動で以下のように
Webアプリケーション要素が追加される。もしなければ、手動で追加する。
8.1 Webアプリケーション(WebApplication)要素の追加
server.xmlで「Webアプリケーション」を選択し、「Add」をクリックする。(下図)
「Add Element」パネルで「アプリケーション・バインディン
グ」を選択し、「OK」をクリックする。(下図)
「アプリケーション・バインディング」が追加されたことを確認
する。(右図)
8.2 アプリケーション・バインディング(application-bnd)要素の追加
© 2016 IBM Corporation
server.xmlで「アプリケーション・バインディング」を選択し、「Add」をクリックする。(下図)
「Add Element」パネルで「セキュリティー・ロール」を選択
し、「OK」をクリックする。(下図)
「セキュリティー・ロール」が追加されたことを確認する。
「セキュリティー・ロール名」属性に入力する。(右図)
(ここでは「TestingSR」とする。後でアプリに設定する。)
8.3 セキュリティー・ロール(security-role)要素の追加
26 server.xmlで「セキュリティー・ロール」を選択し、「Add」をクリックする。(下図)
「Add Element」パネルで「特殊対象」を選択し、「OK」
をクリックする。(下図)
「特殊対象」が追加されたことを確認する。
「特殊対象のタイプ」として、「ALL_AUTHENTICATED
_USERS」を選択する。(右図)
8.4 特殊対象(special-subject)要素の追加
© 2016 IBM Corporation
ここまでの手順により、server.xmlは以下の様な内容となる。
<server description="new server">
<featureManager>
<feature>jsp-2.2</feature>
<feature>samlWeb-2.0</feature>
<feature>localConnector-1.0</feature>
</featureManager>
<httpEndpoint host="*" httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/>
<samlWebSso20>
<authFilter>
<requestUrl urlPattern="/TestProj/*" matchType="equals"/>
</authFilter>
</samlWebSso20>
<keyStore fileBased="true" location="${server.output.dir}/resources/security/key.jks" password="password"/>
<webApplication id="TestProj" location="TestProj.war" name="TestProj">
<application-bnd>
<security-role name="TestingSR">
<special-subject type="ALL_AUTHENTICATED_USERS"></special-subject>
</security-role>
</application-bnd>
</webApplication>
<applicationMonitor dropinsEnabled="true" updateTrigger="mbean" />
</server>
9. server.xmlの一例
Webアプリケーションのweb.xmlファイルで、<security-role>および<security-constraint>を設定する。
(server.xml側で設定した「TestingSR」による認証を可能にする。)
web.xmlへの追加内容の一例
<security-constraint>
<display-name>TestingSC</display-name>
<web-resource-collection>
<web-resource-name>TestingWR</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>TestingSR</role-name>
</auth-constraint>
</security-constraint>
10. (Webアプリケーション側作業)web.xmlの編集
© 2016 IBM Corporation
11. SPメタデータのエクスポート
ブラウザから以下のURLにアクセスすると、SPメタデータが取得できる。
– https://<hostname>:9443/ibm/saml20/defaultSP/samlmetadata
SPメタデータをファイルとして保存し、IdPにインポートする。(SPメタデータの例を以下に示す)
30 <?xml version="1.0" encoding="UTF-8"?> <md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://sora.makuhari.japan.ibm.com:9443/ibm/saml20/defaultSP"> <md:SPSSODescriptor AuthnRequestsSigned="true" WantAssertionsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> <md:KeyDescriptor use="signing"> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509Data> <ds:X509Certificate>MIIDITCCAgmgAwIBAgIEGWOrtTANBgkqhkiG9w0BAQsFADBBMQswCQYDVQQGEwJ1czEMMAoGA1UE (中略) 1tT+BI3SGw== </ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:KeyDescriptor use="encryption"> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509Data> <ds:X509Certificate>MIIDITCCAgmgAwIBAgIEGWOrtTANBgkqhkiG9w0BAQsFADBBMQswCQYDVQQGEwJ1czEMMAoGA1UE (中略) 1tT+BI3SGw== </ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://sora.makuhari.japan.ibm.com:9443/ibm/saml20/defaultSP/acs" index="0" isDefault="true" /> </md:SPSSODescriptor> </md:EntityDescriptor> SP Initiatedフローの確認手順の一例
①SPアプリURLにアクセスする
アクセス先URL例: https://sora.makuhari.japan.ibm.com:9443/TestProj/TestServlet
②IdP認証URLにリダイレクトされる
リダイレクト先URL例: https://idp.ise.com:444/was/sps/WASSAML/saml20/login
③IdP認証ページでログインする
④SPアプリにリダイレクトされる
12.1 環境確認手順の一例(SP Initiatedフロー)
© 2016 IBM Corporation
IdP Initiatedフローの確認手順の一例
①IdP認証URLにアクセスする
IdPに依存する。Tivoli Federated Identity Managerの場合の一例は以下の通り。
https://idp.ise.com:444/was/sps/WASSAML/saml20/logininitial?RequestBinding=HTTPPost&NameIdFormat=email&Partne
rId=https://sora.makuhari.japan.ibm.com:9443/ibm/saml20/defaultSP&Target=https://sora.makuhari.japan.ibm.com:94
43/TestProj/TestServlet
②IdP認証ページでログインする
③SP ACSページにリダイレクトされ、SPアプリにリダイレクトされる
12.2 環境確認手順の一例(IdP Initiatedフロー)
3213. 参考
SAML 2.0 Web Browser Single-Sign-On (再掲)
http://www-01.ibm.com/support/knowledgecenter/api/content/nl/ja-jp/SSD28V_8.5.5/com.ibm.websphere.wlp.core.doc/ae/cwlp_saml_web_sso.html
新卒関西人のWebSphere挑戦記: ① ~WAS Libertyプロファイルの導入~(再掲)
http://www.ibm.com/developerworks/jp/websphere/library/was/liberty_intro/1.html
Configuring SAML Web Browser SSO in Liberty
http://www-01.ibm.com/support/knowledgecenter/api/content/nl/ja-jp/SSD28V_8.5.5/com.ibm.websphere.wlp.core.doc/ae/twlp_config_saml_web_sso.html
SAML web single sign-on version 2.0
© 2016 IBM Corporation
14. SAMLテスト用サーブレット・サンプル・コード 1/6
package jp.test.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import java.util.List; import java.util.Set; import javax.security.auth.Subject; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.ibm.websphere.security.WSSecurityException; import com.ibm.websphere.security.auth.WSSubject; import com.ibm.websphere.security.saml2.Saml20Attribute; import com.ibm.websphere.security.saml2.Saml20Token; /*** Servlet implementation class SamlTestServlet */
@WebServlet("/SamlTest")
public class SamlTestServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public SamlTestServlet() { super(); } 34
14. SAMLテスト用サーブレット・サンプル・コード 2/6
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head><title>SAML 2.0 test sevlet</title></head><body BGCOLOR=¥"#FFFFEE¥">"); out.println("<h1>SAML 2.0 test sevlet</h1>");
try {
Subject callerSubject = WSSubject.getCallerSubject();
Set<Saml20Token> privateCredentials = callerSubject.getPrivateCredentials(Saml20Token.class);
for (Saml20Token samlToken : privateCredentials) { out.println("<h2>SAML 2.0 Token</h2>");
out.println("<table Border=¥"2¥" WIDTH=¥"65%¥" BGCOLOR=¥"#DDDDFF¥">"); print(out, "SAML ID", samlToken.getSamlID());
print(out, "SAML Name ID", samlToken.getSAMLNameID());
print(out, "SAML Name ID Format", samlToken.getSAMLNameIDFormat()); print(out, "SAML Issuer Name", samlToken.getSAMLIssuerName());
print(out, "SAML Issuer Name Format", samlToken.getSAMLIssuerNameFormat()); print(out, "Authentication Method", samlToken.getAuthenticationMethod()); print(out, "Authentication Instant", samlToken.getAuthenticationInstant()); print(out, "Issue Instant", samlToken.getIssueInstant());
print(out, "SAML Expires", samlToken.getSamlExpires());
print(out, "Service Provider ID", samlToken.getServiceProviderID()); print(out, "Subject DNS", samlToken.getSubjectDNS());
print(out, "Subject IP Address", samlToken.getSubjectIPAddress()); print(out, "Assertion QName", samlToken.getAssertionQName().toString());
© 2016 IBM Corporation
14. SAMLテスト用サーブレット・サンプル・コード 3/6
print(out, "Signer Certificate", samlToken.getSignerCertificate().toString()); print(out, "One Time Use", samlToken.isOneTimeUse());
print(out, "Proxy Restriction", samlToken.hasProxyRestriction());
print(out, "Proxy Restriction Count", Long.toString(samlToken.getProxyRestrictionCount())); print(out, "Proxy Restriction Audience", samlToken.getProxyRestrictionAudience().toString()); out.println("</table><BR><BR>");
out.println("SAML 2.0 Attributes");
out.println("<table Border=¥"2¥" WIDTH=¥"65%¥" BGCOLOR=¥"#DDDDFF¥">"); List<Saml20Attribute> samlAttributes = samlToken.getSAMLAttributes();
for (Saml20Attribute attribute : samlAttributes) { String attributeName = attribute.getName();
List<String> attributeValues = attribute.getValuesAsString(); if (attributeValues.size() > 1) {
StringBuilder temp = new StringBuilder("<ul>"); for (String attributeValue : attributeValues) {
temp.append("<li>").append(attributeValue).append("</li>"); }
temp.append("</ul>");
print(out, attributeName, temp.toString()); } else if (attributeValues.size() == 1) { print(out, attributeName, attributeValues.get(0)); } else {
print(out, attributeName, "<no valuses>"); }
}
out.println("</table><BR><BR>"); }
} catch (WSSecurityException ex) { ex.printStackTrace(System.out); }
out.println("</body></html>"); }
14. SAMLテスト用サーブレット・サンプル・コード 4/6
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);
}
private static void print(PrintWriter out, String name, boolean value) { out.println("<tr><td>" + escapeChar(name) + "</td><td>"
+ (value? "true" : "false") + "</td></tr>"); }
private static void print(PrintWriter out, String name, Date value) { print(out, name, value.toString());
}
private static void print(PrintWriter out, String name, String value) { out.println("<tr><td>" + escapeChar(name) + "</td><td>"
+ (value == null ? "<none>" : escapeChar(value)) + "</td></tr>");
}
private static String escapeChar(String str) { if (str == null || str.equals("")) return str; int len = str.length();
for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case '<' : // to "<" len += 3; break; case '>' : // to ">" len += 3; break;
© 2016 IBM Corporation
14. SAMLテスト用サーブレット・サンプル・コード 5/6
case '"' : // to """ len += 5; break; } }if (len == str.length()) return str; char ret[] = new char[len]; int j = 0;
for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case '<' : // to "<" ret[j++] = '&'; ret[j++] = 'l'; ret[j++] = 't'; ret[j++] = ';'; break; case '>' : // to ">" ret[j++] = '&'; ret[j++] = 'g'; ret[j++] = 't'; ret[j++] = ';'; break;
case '&' : // to "&" ret[j++] = '&'; ret[j++] = 'a'; ret[j++] = 'm'; ret[j++] = 'p'; ret[j++] = ';'; break; case '"' : // to """ ret[j++] = '&'; ret[j++] = 'q'; ret[j++] = 'u'; ret[j++] = 'o'; ret[j++] = 't'; ret[j++] = ';'; break; 38
14. SAMLテスト用サーブレット・サンプル・コード 6/6
default : ret[j++] = str.charAt(i); break; } }return new String(ret); }