ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Adaptive Access Manager開発者ガイド
11gリリース2(11.1.2)
B71697-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

12 ネイティブ統合でのフラッシュ・フィンガープリント処理

この章では、Oracle Adaptive Access Managerネイティブ統合内でのフラッシュ・フィンガープリント処理の詳細に焦点を当てています。

この章に記載したコード例はすべて、タスクの実行に必要なコールの概略を示したものです。したがって、完全な実装とは考えないでください。


注意:

この章では、読者がOracle Adaptive Access Managerのネイティブ統合とAPIに精通していることを前提としています。


12.1 デバイスのフィンガープリント処理

保護されたアプリケーションにアクセスする場合、Oracle Adaptive Access Managerではユーザーが使用するデバイスに関する情報が取得されます。この内容は、様々な手段で収集された多様なデータ・ポイントで構成されています。収集されたデータは、デバイスの一意のフィンガープリントにエンコードされます。

アクセス・リクエストでデバイスを使用する際は、Oracle Adaptive Access Managerでデバイスのフィンガープリントが精査されます。このフィンガープリントがその他の多様なデータとともに使用されることで、そのアクセス・リクエストに付随するリスクが判別されます。フィンガープリント・データの収集に使用するテクノロジとして、HTTPヘッダー、セキュアなCookie、共有フラッシュ・オブジェクトおよび動作プロファイリングがあります。

12.2 変数とパラメータの定義

表12-1に、フラッシュ・ムービーとアプリケーション間の相互作用におけるパラメータとレスポンス変数を示します。

表12-1 フラッシュ・ムービーのパラメータとレスポンス変数

パラメータ/レスポンス変数 使用方法

v

フラッシュ・ムービーからアプリケーションに送信されたHTTPリクエスト・パラメータとして使用します。これには、ユーザーが1回使用する生成済のCookie文字列が含まれています。また、この値はHTTPレスポンスで&v=<new value>としてフラッシュ・ムービーに返されます。

client

フラッシュ・ムービーからアプリケーションに送信されたHTTPリクエスト・パラメータとして使用します。これは、フィンガープリント処理を実行しているクライアントのタイプ(この場合はフラッシュ)を示しています。フラッシュ・ムービーからの予想値はvfcです。

fp

フラッシュ・ムービーからアプリケーションに送信されたHTTPリクエスト・パラメータとして使用します。この値には、フラッシュ・プレーヤがアクセスできるクライアント・コンピュータに関する情報が含まれています。


12.3 オプション1

オプション1は、ジャンプ・ページを使用してフィンガープリント処理に使用するフラッシュ・ムービーを組み込む標準的な実装です。オプション1では、フラッシュ・ムービーがユーザーの現在のフラッシュCookie値をサーバーに送信し、サーバーは1回のトランザクションで新しい値を使用して応答しています。

12.3.1 オプション1のフロー

図12-1に、オプション1のフローを示します。

図12-1 オプション1

オプション1が示されています。
  1. ユーザーに対してユーザー名ページが表示されます。

  2. ユーザーはユーザー名を送信します

    1. アプリケーションはユーザーをロードします

    2. アプリケーションはユーザーおよびHTTP情報を使用して、VCryptTracker.updateLogをコールします

  3. ユーザーは、埋込みフラッシュ・ムービーが含まれているジャンプ・ページに送られます

    1. フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーする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())でフラッシュ・ムービーに返されます

  4. ユーザーは、ジャンプ・ページ待機期間後にパスワード・ページに送られます

    1. 認証前ルールを実行します

  5. ユーザーはパスワードを送信します

    1. アプリケーションがパスワードを検証します

    2. 認証後ルールを実行します

    3. 認証結果を使用してVCryptTracker.updateAuthStatusをコールします

12.3.2 オプション1のコード例

この項では、オプション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

12.4 オプション2

オプション2は、ユーザー・エクスペリエンスからジャンプ・ページが削除された、より新しく、より合理的なユーザー・エクスペリエンスです。これを実行するために、フラッシュ・ムービーがユーザー名ページとパスワード・ページの両方に組み込まれています。

最初のムービー(ユーザー名ページ)は、フラッシュCookieとフィンガープリントの既存値の受入れに使用しますが、新規の値は設定されません。ユーザーがロードされてOAAMセッションが作成された後で2番目のムービー(パスワード・ページ)が表示され、セッションの新規の値がクライアント・マシンに設定されます。

12.4.1 オプション2のフロー

図12-2に、オプション2のフローを表示します。

図12-2 オプション2

オプション2が示されています。
  1. ユーザーに対して、フラッシュ・ムービーを埋め込んだユーザー名ページが表示されます。

    1. フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーするHTTPリクエストを作成します

      i.サーバーはHTTPリクエストのパラメータvを取得して、セッションに格納します

      ii.サーバーは、HTTPリクエストのパラメータclientを取得します

      iii.サーバーは、HTTPリクエストのパラメータfpを取得します

      iv.fpをVCryptServletUtil.getFlashFingerprint(client, fp)で解析して、結果をユーザー・セッションに格納します

      v.取得された値vが、HTTPレスポンス("&v=" + cookieSet.getFlashCookie())でフラッシュ・ムービーに返されます

  2. ユーザーはユーザー名を送信します

    1. アプリケーションはユーザーをロードします

    2. 認証前ルールを実行します

    3. ユーザー、HTTP Cookie、およびフラッシュの値を使用してVCryptTracker.updateLogをコールします

  3. ユーザーは、フラッシュ・ムービーが埋め込まれているパスワード・ページに送られます

    1. フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーするHTTPリクエストを作成します

      i.サーバーはすでに、前のフラッシュ・リクエストから値を取得しています

      ii.UpdateLogコールにより新規に生成された値がフラッシュ・ムービーに返されます

  4. ユーザーはパスワードを送信します

    1. アプリケーションがパスワードを検証します

    2. 認証後ルールを実行します

    3. 認証結果を使用してVCryptTracker.updateAuthStatusをコールします

12.4.2 オプション2のコード例

この項では、オプション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 happened, using previously generated cookie set
                    }
                 return cookieSet.getFlashCookie();
             } catch (Exception e) {
                   // Handle fingerprinting error
             }
             return "";
} // flashFingerPrint

12.5 オプション3

オプション3はユーザー名とパスワードに1つのページを使用する実装であり(仮想認証デバイスは使用しません)、ジャンプ・ページを使用してフィンガープリント処理用にフラッシュ・ムービーを組み込みます。この場合は、フラッシュ・ムービーがユーザーの現在のフラッシュCookie値をサーバーに送信し、サーバーは1回のトランザクションで新しい値を使用して応答します。

12.5.1 オプション3のフロー

図12-3に、オプション3のフローを示します。

図12-3 オプション3のフロー

オプション3のフローが示されています。
  1. ユーザーに対して1つのユーザー名とパスワードのページが表示されます。

  2. ユーザーはユーザー名とパスワードを送信します

    1. アプリケーションはユーザーをロードします

    2. アプリケーションがパスワードを検証します

    3. ユーザー、認証結果、およびHTTP Cookieを使用してVCryptTracker.updateLogをコールします

  3. ユーザーは、埋込みフラッシュ・ムービーが含まれているジャンプ・ページに送られます

    1. フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーする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())でフラッシュ・ムービーに返されます

  4. ユーザーは、ジャンプ・ページ待機期間後にアプリケーションで続行します

    1. 認証後ルールを実行します

    2. 認証結果を使用してVCryptTracker.updateAuthStatusをコールします

12.5.2 オプション3のコード例

この項では、オプション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

12.6 一般的な更新

実装では、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;
}

12.7 ネイティブ統合を行うWebアプリケーションに組み込まれたフラッシュ・フィンガープリント処理

フラッシュ・フィンガープリント処理の実装手順は、次のとおりです。

ネイティブ統合のサンプル・アプリケーションでは、dcPurpというパラメータを使用してフラッシュ・ムービーをhandleFlash.jspにポストします。

dcPurpに使用可能な値は次の3つです。

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にポストする必要があることを示します。