Oracle® Fusion Middleware Oracle Access Management開発者ガイド 11gリリース2 (11.1.2.3.0) for All Platforms E67354-04 |
|
前 |
次 |
Oracle Security Token Serviceにおいて、検証または発行するトークンがデフォルトでサポートされていない場合、独自の検証および発行モジュール・クラスを記述できます。この章では、Oracle Security Token Serviceのカスタム・トークン・オプションについて説明します。内容は次のとおりです。
カスタム・トークンには、2つ(検証または発行クラス)のいずれかが必要です。
カスタム検証クラス: カスタム・トークンの検証に使用します。
カスタム発行クラス: カスタム・トークンの発行に使用します。
次の概要では、実行する必要があるタスクを説明します。
タスク概要: カスタム・トークン・モジュール・クラスのデプロイ
TokenValidatorModuleクラスを記述し、必要に応じて、Oracle Security Token Serviceによりカスタム・トークンを検証します。
TokenIssuanceModuleクラスを記述し、必要に応じて、Oracle Security Token Serviceによりカスタム・トークンを発行します。
カスタム・トークンの検証テンプレートおよび発行テンプレートをユーザーが作成できるカスタム・トークン・モジュールを作成します。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。
カスタム・トークンの検証および発行テンプレートを作成し、そのカスタム・テンプレートを、標準トークンのテンプレートを使用するようにエンドポイントおよびパートナ・プロファイルで使用します。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。
この項の内容は次のとおりです。
Oracle Security Token Service検証モジュール・クラスは、oracle.security.fed.sts.token.tpe.TokenValidatorModule
インタフェースを実装します。検証プロセスでは、次のプロパティをTokenContext
からフェッチできます。
XML_TOKEN: 検証が必要なトークンが含まれるXMLメッセージのバイト数。
BST_VALUE_TYPE: カスタム・トークンがバイナリ・セキュリティ・トークンとして送信される場合、これにはバイナリ・セキュリティ・トークン値タイプが含まれます。
BST_ENCODING: トークンがバイナリ・セキュリティ・トークンとして送信される場合、これにはエンコーディングが含まれます。
BST_CONTENT: トークンがバイナリ・セキュリティ・トークンとして送信される場合、これにはバイナリ・セキュリティ・トークン・コンテンツが含まれます。
TOKEN_ELEMENT: トークンがバイナリ・セキュリティ・トークンではなく、Oracle Security Token Service内部クラスにJAXB表現がない場合、これにはトークンを表すXML要素またはカスタムJAXBクラスが含まれます。
XML_DOM: これは着信メッセージのDOM表現です。これは、DOMオブジェクトがこれまでOracle Security Token Service処理の一部として作成されていた場合のみ存在します。
トークンは、TokenContext
のプロパティの情報を使用して検証される必要があり、TokenResult
が戻される必要があります。TokenResult
オブジェクトで次のプロパティを設定し、Oracle Security Token Serviceに情報を戻すことができます。
TPE_RESULT_FAILURE_CODE: 失敗した場合の失敗コード。
TPE_RESULT_FAILURE_STRING: 失敗を説明する文字列。
結果で設定された他のプロパティは、トークン・マッピングに使用される状況において使用可能です。通常、バリデータはSTS_SUBJECT_IDプロパティを名前IDに設定し、これを使用してユーザー・レコードにマップします。
例21-1 EmailTokenValidatorModuleImpl.java
package oracle.security.fed.sts.tpe.providers.email; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import oracle.security.fed.sts.token.tpe.TokenContext; import oracle.security.fed.sts.token.tpe.TokenProcessingException; import oracle.security.fed.sts.token.tpe.TokenResult; import oracle.security.fed.sts.token.tpe.TokenValidatorModule; import oracle.security.fed.sts.token.tpe.TokenResultImpl; import oracle.security.fed.sts.tpe.providers.TokenValidationErrors; import oracle.security.fed.xml.security.wss.ext.v10.BinarySecurityTokenType; import oracle.security.fed.util.common.Base64; import sun.misc.BASE64Decoder; import org.w3c.dom.Document; import org.w3c.dom.Element; public class EmailTokenValidatorModuleImpl implements TokenValidatorModule{ private Map options = null; private String testSetting = null; private static final String TEST_SETTING_IN_TEMPLATE = "testsetting"; public void init(Map options1) throws TokenProcessingException{ options = options1; try{ testSetting = (String)options.get(TEST_SETTING_IN_TEMPLATE); }catch(Exception e){ throw new TokenProcessingException(e); } } public TokenResult validate(TokenContext context) throws TokenProcessingException{ byte[] tokenBytes = (byte[])context.getOtherProperties().get("XML_TOKEN"); Document inputDocument = (Document)context.getOtherProperties().get("XML_DOM"); Element tokenElement = (Element)context.getOtherProperties().get("TOKEN_ELEMENT"); String encodedBytes = (String) context.getOtherProperties().get("BST_CONTENT"); byte[] decodedBytes = null; BASE64Decoder decoder = new BASE64Decoder(); try{ if(encodedBytes != null){ decodedBytes = decoder.decodeBuffer(encodedBytes); } }catch(java.io.IOException exp){ exp.printStackTrace(); } if(tokenElement != null && tokenElement.getLocalName().equals("email")){ String emailAddress = tokenElement.getTextContent(); TokenResultImpl result = null; result = new TokenResultImpl(0, TokenResult.SUCCESS, null); result.setTokenProperty("STS_SUBJECT_ID", emailAddress); //add any other attributes - necessary only if you need for mapping or issuance result.setTokenProperty("testattr2", "attr2"); return result; }else if (decodedBytes != null) { String emailAddress = new String(decodedBytes); TokenResultImpl result = null; result = new TokenResultImpl(0, TokenResult.SUCCESS, null); result.setTokenProperty("STS_SUBJECT_ID", emailAddress); //add any other attributes - necessary only if you need for mapping or issuance result.setTokenProperty("testattr2", "attr2"); return result; } else { TokenResultImpl result = new TokenResultImpl(0, TokenResult.FAILURE, null); String failureCode = null; failureCode = "TEST_FAILURE_CODE"; result.setTokenProperty("TPE_RESULT_FAILURE_CODE", failureCode); result.setTokenProperty("TPE_RESULT_FAILURE_STRING", "validation failed"); return result; } } }
次の概要では、このモジュール・クラスの開発におけるハイライトを説明します。
開発におけるハイライト: TokenValidatorModuleクラスの記述
init(Map options)
メソッドを実装します。これはTokenValidatorModule
が初期化された場合にコールされます。init
メソッドは、検証テンプレートで定義されたパラメータが含まれるマップに渡されます。
validate(TokenContext context)
メソッドを実装します。これは、特定の着信カスタム・トークンを検証する必要がある場合にコールされます。
TokenContext
オブジェクトのプロパティからトークン情報をフェッチします。
トークンを検証し、TokenResult
オブジェクトを戻します。
成功時には次を戻します。
TokenResultImpl result = new TokenResultImpl(0, TokenResult.SUCCESS, token);
失敗時には次を戻します。
TokenResultImpl result = new TokenResultImpl(0, TokenResult.FAILURE, token); result.setTokenProperty("TPE_RESULT_FAILURE_CODE", failureCode); result.setTokenProperty("TPE_RESULT_FAILURE_STRING", "validation failed");
検証済トークン結果において、トークンのSubjectID
およびトークンに基づいて解析された属性が次の形式で戻されることを確認します。
result.setTokenProperty("STS_SUBJECT_ID", emailAddress); //add any other attributes - necessary only if you need for mapping or issuance result.setTokenProperty("testattr2", "attr2")
次のタスクを実行し、カスタムTokenValidatorModuleクラスを記述します。
タスクの概要: TokenValidatorModuleクラスの記述
次を参照して、独自のモジュール・クラスを開発します。
Oracle Fusion Middleware Oracle Access Management Security Token Service Java APIリファレンス
必要に応じて次に進みます。
Security Token Serviceのカスタム構成の管理の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。
この項の内容は次のとおりです。
EmailTokenIssuerModuleImpl.java
クラスは、oracle.security.fed.sts.token.tpe.TokenIssuerModule
インタフェースおよびTokenContext
の属性を実装する必要があります。
例21-2は、EmailTokenIssuanceModuleImpl
クラスの例を示しています。次の概要では、このモジュール・クラスの開発におけるハイライトを説明します。
例21-2 EmailTokenIssuanceModule.java
package oracle.security.fed.sts.tpe.providers.email; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.HashMap; import javax.xml.namespace.QName; import oracle.security.fed.sts.token.tpe.TokenContext; import oracle.security.fed.sts.token.tpe.TokenIssuerModule; import oracle.security.fed.sts.token.tpe.TokenProcessingException; import oracle.security.fed.sts.token.tpe.TokenResult; import oracle.security.fed.sts.token.tpe.Token; import oracle.security.fed.sts.token.tpe.TokenImpl; import oracle.security.fed.sts.token.tpe.TokenResult; import oracle.security.fed.sts.token.tpe.TokenResultImpl; public class EmailTokenIssuerModuleImpl implements TokenIssuerModule{ Map config; private static final String TEST_SETTING_IN_TEMPLATE = "testsetting"; public void init(Map options) throws TokenProcessingException { config = options; } public TokenResult issue(TokenContext context) throws TokenProcessingException { //use any config options necessary for processing from issuance template String setting = (String)config.get(TEST_SETTING_IN_TEMPLATE); HashMap attributes = (HashMap)context.getOtherProperties().get("STS_TOKEN_ATTRIBUTES"); System.out.println("attributes : " + attributes.toString()); String emailAddress = null; Iterator attrIter = null; if (attributes != null) { attrIter = attributes.keySet().iterator(); } if (attrIter != null) { while (attrIter.hasNext()) { String attributeName = (String)attrIter.next(); if ("mail".equals(attributeName)) { Object valuesObj = attributes.get(attributeName); if (valuesObj instanceof List){ Iterator iter = ((List)valuesObj).iterator(); while (iter.hasNext()) { Object valueObj = iter.next(); if(valueObj instanceof String){ emailAddress = (String)valueObj; break; } } } else if (valuesObj instanceof String) { emailAddress = (String)valuesObj; } } } } String email = "<email>" + emailAddress + "</email>"; System.out.println("email : " + email); TokenImpl token = new TokenImpl(); byte[] tokenBytes = email.getBytes(); token.setTokenBytes(tokenBytes); //set the below if you have a doc object that can be reused token.setTokenDocument(null); token.setTokenBytes(tokenBytes); TokenResultImpl result = new TokenResultImpl(0, TokenResult.SUCCESS, token); Map resultMap = new HashMap(); resultMap.put("STS_KEY_IDENTIFIER_VALUE", emailAddress); resultMap.put("STS_KEY_IDENTIFIER_VALUE_TYPE", "EmailAddress"); System.out.println("TOKEN_KEY_IDENTIFIER_VALUE : " + emailAddress); result.setTokenProperties(resultMap); return result; } }
開発におけるハイライト: TokenIssuanceModuleクラスの記述
public void init(Map options)throws TokenProcessingException
メソッドを実装します。
発行者モジュールが初期化されると、init()
メソッドがコールされます。init
メソッドには、発行テンプレートで定義されたパラメータが含まれるマップが渡されます。
public TokenResult issue(TokenContext context) throws TokenProcessingException
メソッドを実装します。
このメソッドは、カスタム送信トークンを作成する必要がある場合にコールされます。
issue
メソッド内で、発行テンプレートの属性およびTokenContext
に渡された属性を使用してトークンを作成します。TokenContext
の属性には、次の方法でアクセスします。
HashMap attributes = (HashMap)context.getOtherProperties().get("STS_TOKEN_ATTRIBUTES"); System.out.println("attributes : " + attributes.toString()); String emailAddress = null; Iterator attrIter = null; if (attributes != null) { attrIter = attributes.keySet().iterator(); } if (attrIter != null) { while (attrIter.hasNext()) { String attributeName = (String)attrIter.next(); if ("mail".equals(attributeName)) { Object valuesObj = attributes.get(attributeName); if (valuesObj instanceof List){ Iterator iter = ((List)valuesObj).iterator(); while (iter.hasNext()) { Object valueObj = iter.next(); if(valueObj instanceof String){ emailAddress = (String)valueObj; break; } } } else if (valuesObj instanceof String) { emailAddress = (String)valuesObj; } } } } Status
結果オブジェクトを作成し、トークンのバイト数と、トークンのDocument Object Model (DOM)表現を設定します(DOM表現がこのクラスの処理中に作成された場合のみ)。
token.setTokenDocument(null);--> if you have a doc object that can be reuse.d set it here token.setTokenBytes(tokenBytes); TokenResult result = new TokenResultImpl(0, TokenResult.SUCCESS, token);
次のように、キー識別子情報をトークン・プロパティに設定します。
Map resultMap = new HashMap(); resultMap.put("STS_KEY_IDENTIFIER_VALUE", emailAddress); resultMap.put("STS_KEY_IDENTIFIER_VALUE_TYPE", "EmailAddress"); result.setTokenProperties(resultMap);
注意: トークン・プロパティとして設定される属性は、コンテキストにおいて使用可能です。これらの属性をトークン・マッピングに使用したり、リライイング・パーティのプロファイル属性セクションで指定して、通常の方法で送信トークンに含めることができます。 |
タスクの概要: 発行モジュール・クラスの記述
第21.3.1項「TokenIssuanceModuleクラスの記述について」およびOracle Fusion Middleware Oracle Access Management Security Token Service Java APIリファレンスを参照して、発行モジュール・クラスを記述します。
Security Token Serviceのカスタム構成の管理の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。