Oracle® Fusion MiddlewareOracle Adaptive Access Manager開発者ガイド 11gリリース2 (11.1.2.3.0) E67356-01 |
|
前 |
次 |
この章では、Oracle Adaptive Access Managerネイティブ統合内でのフラッシュ・フィンガープリント処理の詳細に焦点を当てています。
この章に記載したコード例はすべて、タスクの実行に必要なコールの概略を示したものです。したがって、完全な実装とは考えないでください。
注意: この章では、読者がOracle Adaptive Access Managerのネイティブ統合とAPIに精通していることを前提としています。 |
この章は次の項で構成されています:
保護されたアプリケーションにアクセスする場合、Oracle Adaptive Access Managerではユーザーが使用するデバイスに関する情報が取得されます。この内容は、様々な手段で収集された多様なデータ・ポイントで構成されています。収集されたデータは、デバイスの一意のフィンガープリントにエンコードされます。
アクセス・リクエストでデバイスを使用する際は、Oracle Adaptive Access Managerでデバイスのフィンガープリントが精査されます。このフィンガープリントがその他の多様なデータとともに使用されることで、そのアクセス・リクエストに付随するリスクが判別されます。フィンガープリント・データの収集に使用するテクノロジとして、HTTPヘッダー、セキュアなCookie、共有フラッシュ・オブジェクトおよび動作プロファイリングがあります。
表12-1に、フラッシュ・ムービーとアプリケーション間の相互作用におけるパラメータとレスポンス変数を示します。
表12-1 フラッシュ・ムービーのパラメータとレスポンス変数
パラメータ/レスポンス変数 | 使用方法 |
---|---|
v |
フラッシュ・ムービーからアプリケーションに送信されたHTTPリクエスト・パラメータとして使用します。これには、ユーザーが1回使用する生成済のCookie文字列が含まれています。また、この値はHTTPレスポンスで&v=<new value>としてフラッシュ・ムービーに返されます。 |
client |
フラッシュ・ムービーからアプリケーションに送信されたHTTPリクエスト・パラメータとして使用します。これは、フィンガープリント処理を実行しているクライアントのタイプ(この場合はフラッシュ)を示しています。フラッシュ・ムービーからの予想値はvfcです。 |
fp |
フラッシュ・ムービーからアプリケーションに送信されたHTTPリクエスト・パラメータとして使用します。この値には、フラッシュ・プレーヤがアクセスできるクライアント・マシンに関する情報が含まれています。 |
この項では、フラッシュ・フィンガープリント処理の様々な実装に関して説明します。
オプション1は、ジャンプ・ページを使用してフィンガープリント処理に使用するフラッシュ・ムービーを組み込む標準的な実装です。オプション1では、フラッシュ・ムービーがユーザーの現在のフラッシュCookie値をサーバーに送信し、サーバーは1回のトランザクションで新しい値を使用して応答しています。
図12-1に、オプション1のフローを示します。
ユーザーに対してユーザー名ページが表示されます。
ユーザーはユーザー名を送信します
アプリケーションはユーザーをロードします
アプリケーションはユーザーおよびHTTP情報を使用して、VCryptTracker.updateLogをコールします
ユーザーは、埋込みフラッシュ・ムービーが含まれているジャンプ・ページに送られます
フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーするHTTPリクエストを作成します
i. サーバーはHTTPリクエストのパラメータvを取得して、セッションに格納します
ii. サーバーは、HTTPリクエストのパラメータclientを取得します
iii. サーバーは、HTTPリクエストのパラメータfpを取得します
iv. fpをVCryptServletUtil.getFlashFingerprint (client, fp)で解析します
v. ユーザー、HTTP Cookieおよびフラッシュ情報を使用してVCryptTracker.updateLogをコールします
vi. updateLogからCookieSetで返された新しいフラッシュCookieが、HTTPレスポンス("&v=" + cookieSet.getFlashCookie())でフラッシュ・ムービーに返されます
ユーザーは、ジャンプ・ページ待機期間後にパスワード・ページに送られます
認証前ルールを実行します
ユーザーはパスワードを送信します
アプリケーションがパスワードを検証します
認証後ルールを実行します
認証結果を使用してVCryptTracker.updateAuthStatusをコールします
この項では、オプション1のコード例を示しています。
public String flashFingerPrint(HttpServletRequest request) { HttpSession session = request.getSession(true); try { String digitalCookie = request.getParameter("v"); String fpStr = request.getParameter("fp"); String client = request.getParameter("client"); String flashFingerprint = VCryptServletUtil.getFlashFingerPrint(client, fpStr); session.setAttribute("v", digitalCookie); session.setAttribute("fp", flashFingerprint); VCryptAuthUser clientUser = (VCryptAuthUser) session.getAttribute("clientUser"); if (clientUser == null) { // User not found in session return ""; } String loginId = clientUser.getLoginId(); String customerId = clientUser.getCustomerId(); String groupId = clientUser.getCustomerGroupId(); int clientType = UserDefEnum.getElementValue (IBharosaConstants.ENUM_CLIENT_TYPE_ID, FLASH_CLIENT_ENUM); cookieSet = updateLog(request, loginId, customerId, groupId, clientType, authResult); session.setAttrubute("cookieSet"); return cookieSet.getFlashCookie(); } catch (Exception e) { // Handle fingerprinting error } return ""; } // flashFingerPrint
オプション2は、ユーザー・エクスペリエンスからジャンプ・ページが削除された、より新しく、より合理的なユーザー・エクスペリエンスです。これを実行するために、フラッシュ・ムービーがユーザー名ページとパスワード・ページの両方に組み込まれています。
最初のムービー(ユーザー名ページ)は、フラッシュCookieとフィンガープリントの既存値の受入れに使用しますが、新規の値は設定されません。ユーザーがロードされてOAAMセッションが作成された後で2番目のムービー(パスワード・ページ)が表示され、セッションの新規の値がクライアント・マシンに設定されます。
図12-2に、オプション2のフローを表示します。
ユーザーに対して、フラッシュ・ムービーを埋め込んだユーザー名ページが表示されます。
フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーするHTTPリクエストを作成します
i. サーバーはHTTPリクエストのパラメータvを取得して、セッションに格納します
ii. サーバーは、HTTPリクエストのパラメータclientを取得します
iii. サーバーは、HTTPリクエストのパラメータfpを取得します
iv. fpをVCryptServletUtil.getFlashFingerprint(client, fp)で解析して、結果をユーザー・セッションに格納します
v. 取得された値vが、HTTPレスポンス("&v=" + cookieSet.getFlashCookie())でフラッシュ・ムービーに返されます
ユーザーはユーザー名を送信します
アプリケーションはユーザーをロードします
認証前ルールを実行します
ユーザー、HTTP Cookie、およびフラッシュの値を使用してVCryptTracker.updateLogをコールします
ユーザーは、フラッシュ・ムービーが埋め込まれているパスワード・ページに送られます
フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーするHTTPリクエストを作成します
i. サーバーはすでに、前のフラッシュ・リクエストから値を取得しています
ii. UpdateLogコールにより新規に生成された値がフラッシュ・ムービーに返されます
ユーザーはパスワードを送信します
アプリケーションがパスワードを検証します
認証後ルールを実行します
認証結果を使用してVCryptTracker.updateAuthStatusをコールします
この項では、オプション2のコード例を示しています。
public String flashFingerPrint(HttpServletRequest request) { HttpSession session = request.getSession(true); try { CookieSet cookieSet = (CookieSet)session.getAttribute("cookieSet"); if (cookieSet == null) { String digitalCookie = request.getParameter("v"); String fpStr = request.getParameter("fp"); String client = request.getParameter("client"); String flashFingerprint = VCryptServletUtil.getFlashFingerPrint(client, fpStr); session.setAttribute("v", digitalCookie); session.setAttribute("fp", flashFingerprint); } else { // finger printing already occurred, using previously // generated cookie set } return cookieSet.getFlashCookie(); } catch (Exception e) { // Handle fingerprinting error } return ""; } // flashFingerPrint
オプション3はユーザー名とパスワードに1つのページを使用する実装であり(仮想認証デバイスは使用しません)、ジャンプ・ページを使用してフィンガープリント処理用にフラッシュ・ムービーを組み込みます。この場合は、フラッシュ・ムービーがユーザーの現在のフラッシュCookie値をサーバーに送信し、サーバーは1回のトランザクションで新しい値を使用して応答します。
図12-3に、オプション3のフローを示します。
ユーザーに対して1つのユーザー名とパスワードのページが表示されます。
ユーザーはユーザー名とパスワードを送信します
アプリケーションはユーザーをロードします
アプリケーションがパスワードを検証します
ユーザー、認証結果、およびHTTP Cookieを使用してVCryptTracker.updateLogをコールします
ユーザーは、埋込みフラッシュ・ムービーが含まれているジャンプ・ページに送られます
フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーするHTTPリクエストを作成します
i. サーバーはHTTPリクエストのパラメータvを取得して、セッションに格納します
ii. サーバーは、HTTPリクエストのパラメータclientを取得します
iii. サーバーは、HTTPリクエストのパラメータfpを取得します
iv. fpをVCryptServletUtil.getFlashFingerprint(client, fp)で解析します
v. ユーザー、HTTP Cookie、およびフラッシュ情報を使用してVCryptTracker.updateLogをコールします
vi. updateLogからCookieSetで返された新しいフラッシュCookieが、HTTPレスポンス("&v=" + cookieSet.getFlashCookie())でフラッシュ・ムービーに返されます
ユーザーは、ジャンプ・ページ待機期間後にアプリケーションで続行します
認証後ルールを実行します
認証結果を使用してVCryptTracker.updateAuthStatusをコールします
この項では、オプション3のコード例を示しています。
public String flashFingerPrint(HttpServletRequest request) { HttpSession session = request.getSession(true); try { String digitalCookie = request.getParameter("v"); String fpStr = request.getParameter("fp"); String client = request.getParameter("client"); String flashFingerprint = VCryptServletUtil.getFlashFingerPrint(client, fpStr); session.setAttribute("v", digitalCookie); session.setAttribute("fp", flashFingerprint); VCryptAuthUser clientUser = (VCryptAuthUser) session.getAttribute("clientUser"); if (clientUser == null) { // User not found in session return ""; } String loginId = clientUser.getLoginId(); String customerId = clientUser.getCustomerId(); String groupId = clientUser.getCustomerGroupId(); int clientType = UserDefEnum.getElementValue(IBharosaConstants.ENUM_CLIENT_TYPE_ID, FLASH_CLIENT_ENUM); cookieSet = updateLog(request, loginId, customerId, groupId, clientType, authResult); session.setAttrubute("cookieSet"); return cookieSet.getFlashCookie(); } catch (Exception e) { // Handle fingerprinting error } return ""; } // flashFingerPrint
実装では、updateLogコールを実行するために、次のようなメソッドが使用されます。
protected CookieSet updateLog(HttpServletRequest request, String loginId, String userId, String groupId, int clientType, int authStatus) throws BharosaProxyException { HttpSession session = request.getSession(tru); String requestId = (String) session.getAttribute("requestId"); String remoteIPAddr = request.getRemoteAddress(); String remoteHost = request.getRemoteHost(); String secureCookie = VCryptServletTrackerUtil.getSecureCookie(request); String secureClientVersion = "1.0"; Object[] fingerPrintInfo = VCryptServletUtil.getBrowserFingerPrint(request); int fingerPrintType = fingerPrintInfo == null ? 0 : ((Integer)fingerPrintInfo[0]).intValue(); String fingerPrint = fingerPrintInfo == null ? "" : (String)fingerPrintInfo[1]; int fingerPrintType2 = VCryptServletUtil.flashFPType.intValue(); String fingerPrint2 = (String) session.getAttribute("fp"); String digitalCookie = (String) session.getAttribute("v"); CookieSet cookieSet = (CookieSet) session.getAttribute("cookieSet"); if (secureCookie == null && cookieSet != null) { secureCookie = cookieSet.getSecureCookie(); } if (digitalCookie == null && cookieSet != null) { digitalCookie = cookieSet.getFlashCookie(); } boolean isSecure = false; VCryptTracker vTracker = VCryptTrackerUtil.getVCryptTrackerInstance(); cookieSet = vTracker.updateLog(requestId, remoteIPAddr, remoteHost, secureCookie, digitalCookie, groupId, userId, loginId, isSecure, authStatus, clientType, secureClientVersion, fingerPrintType, fingerPrint, fingerPrintType2, fingerPrint2); return cookieSet; }
フラッシュ・フィンガープリント処理の実装手順は、次のとおりです。
ネイティブ統合のOAAMサンプル・アプリケーションでは、dcPurp
というパラメータを使用してフラッシュ・ムービーをhandleFlash.jsp
にポストします。
dcPurp
に使用可能な値は次の3つです。
sample: これはhandleFlash.jsp
にポストします。
native: これはdc
にポストします。このdc
は、フィンガープリントのポストを受け入れるためにJavaサーブレットとして構成されます。この目的では、OAAMクラスのCookieManager.java
を使用できます。
uio: これはflashFingerprint.do
にポストします。
.net: これはCookieManager.aspx
にポストします。
dcPurp
に対して値が渡されない場合は、dc
が使用されます。
次のサンプル・コードは参照用です。
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="1" height="1" id="flash" align="middle"> <param name="allowScriptAccess" value="sameDomain"/> <param name="movie" value="<%= redirect_flashSrc %>"/> <param name="quality" value="low"/> <param name="bgcolor" value="#ffffff"/> <param name="FlashVars" value="dcPurp=sample"/> <embed src="<%= redirect_flashSrc %>" quality="low" bgcolor="#ffffff" FlashVars="dcPurp=sample" width="1" height="1" name="flash" align="middle" allowScriptAccess= "sameDomain" type="application/x-shockwave-flash"/> </object>
FlashVars
のキー/値ペアであるdcPurp=sample
は、フラッシュ・ムービーをhandleFlash.jsp
にポストする必要があることを示します。