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