認証では、リソースへのアクセスをリクエストしているユーザーに必要な資格証明を確認し、HTTPを介して資格証明を収集し、資格証明の検証結果に基づいてHTTPレスポンスを返します。
フォーム・ベース認証を使用することで、アクセス・システムの認証および認可メカニズムを使用してユーザーのログインを処理する、カスタマイズされたWebフォームを作成できます。これらのフォームはHTMLページであり、ログイン情報の複数言語での表示、会社のプレゼンテーション標準に準拠したユーザー・インタフェース要素の表示、およびログイン・ページへの機能の追加(ロスト・パスワード管理など)に使用できます。
この章の内容は次のとおりです。
次の条件に該当する場合、アクセス・システムでは、認証スキームに構成されたフォームをユーザーに提示します(「ユーザー認証の構成」を参照)。
Webリソースが、フォームを必要とする認証スキームを使用するポリシーで保護されており、有効なセッションCookie(ObSSOCookie)が存在しない場合。
有効なセッションCookieは存在するが、(チャレンジ・メソッドにかかわらず)より低い認証レベルからのものである場合。
認証チャレンジは、ユーザー資格証明のテキスト入力フィールドを1つ以上持つHTMLフォームです。一般的なフォーム・ベース認証では、ユーザーはフォームの2つのテキスト・ボックスにユーザー名とパスワードを入力します。最も一般的な資格証明の選択肢はユーザー名とパスワードですが、ユーザー名、パスワードおよびドメインなどの任意のユーザー属性を使用できます。「送信」ボタンによって、フォームの内容がポストされます。ユーザーが「送信」ボタンをクリックすると、フォームのデータがWebサーバーにポストされます。WebGateがフォームのデータを捕捉し、処理します。フォームで収集されたユーザー資格証明が検証され、ユーザーが認証されます。
フォーム・ベース認証は、次のような理由により使用されます。
フォーム・ベースのログインおよび標準化されたログアウトを使用すると、ユーザーは、ブラウザ間で一貫したログインおよびログアウト機能を使用できます。
詳細は、「ログアウトの構成」を参照してください。
組織のルック・アンド・フィールを認証プロセスに適用できます。
たとえば、カスタム・フォームには、Basic認証で使用される標準的なユーザー名とパスワードのウィンドウのかわりに、会社のロゴやウェルカム・メッセージを含めることができます。
ログイン時に追加情報を収集できます。
「ロスト・パスワード管理」ページへのリンクなど、ログインの手順に追加機能を提供できます。
ロスト・パスワード管理の詳細は、『Oracle Access Manager IDおよび共通管理ガイド』を参照してください。
フォーム・ベース認証のために作成するフォームでは、ユーザーの資格証明の収集のみを実行します。認証および認可は、他の機能によって処理されます。概要は、第4章「ポリシー・ドメインによるリソースの保護」を参照してください。
フォーム・ベース認証の概要を次に示します。詳細は、「フォーム・ベース認証の構成」を参照してください。
ユーザー名とパスワードなど、ユーザーの資格証明を送信できるHTMLフォームを作成します。
詳細は、「フォーム作成時の考慮点」を参照してください。
フォームを、WebGateを持つWebサーバー上の、保護されていないディレクトリまたは匿名認証スキームで保護されているディレクトリに置きます。
同じログイン・フォームおよびそれに関連付けられた認証スキームを、複数のポリシー・ドメインで使用できます。
フォーム・ベース認証を使用する認証スキームを設定し、ログイン・フォームへのパスを定義します。
詳細は、「認証スキームの定義および管理」を参照してください。
HTTP GETまたはPOSTを使用して、フォーム・アクションをコールします。
詳細は、「フォーム・アクションの概要」を参照してください。
ログイン・フォームのアクションで、ポリシーを使用してターゲットURLを保護します。
詳細は、第5章「ユーザー認証の構成」を参照してください。
チャレンジ・パラメータおよびパススルー・モードを、認証スキームで構成します。
詳細は、「チャレンジ・パラメータ」を参照してください。
プラグインを指定します。
詳細は、「フォーム・ベース認証で使用されるプラグイン」を参照してください。
この項の残りの内容は次のとおりです。
注意: IISの場合は、Access ManagerとWebGateを同じフォルダの下にインストールする必要があります。そうでない場合、認証が失敗します。 |
「フォーム」チャレンジ・メソッドを選択した場合は、「新規認証スキームの定義」の説明に従って、「チャレンジ・パラメータ」フィールドに、次の3つのパラメータを入力する必要があります。
チャレンジ・パラメータ | 説明 |
---|---|
form: |
HTMLフォームの場所を、ホストのドキュメント・ディレクトリからの相対パスで指定します。次に例を示します。
|
creds: |
ログインに使用されるHTMLフォーム内のすべてのフィールドをリストします。creds:は、スペース区切りのリストです。次に例を示します。
ユーザーが送信するログイン・フォームがフォーム・ベースのチャレンジ・メソッドを使用した認証スキームで保護されている場合、WebGateはこのパラメータに指定された資格証明を処理します。METHOD=POSTプロセスを使用するフォームの場合、リクエストの本体にフォームからの資格証明データを付けてブラウザがPOSTリクエストをWebサーバーに送信します。フォームでMETHOD=GETが使用されている場合は、 注意: |
action |
HTMLフォームのポスト先のURL。 |
ssoCookie |
シングル・サインオンCookieの保護および複数のセッションにわたる永続化Cookieの設定に使用します。
詳細は、「認証スキーム内のObSSOCookieの保護」および「複数セッションにわたるObSSOCookieの保持」を参照してください。 |
注意: カスタム・プラグインを使用するフォーム・ベース認証時には、元のリソース名は、チャレンジ・パラメータcreds リストの事前定義名として使用できません。たとえば、認証プラグインAPIでは、ObAnPluginInfo 構造体はCreds データ型を含み、アクセス・サーバーはこのリストにResource、Operation、RequesterDNおよびRequesterIPの4つの事前定義名を提供します。
フォーム・ベース認証の使用時にAPIによって返されるリソースは、元のURLの実際のリソースではなく、ログイン・フォームがPOSTする先のリソースです。 |
追加パラメータのpassthrough
およびmaxpostdatabytes
は、オプションです。
ログイン資格証明を後処理システムに渡す場合は、passthrough:yes
を入力します。たとえば、ヘッダー変数を受け取らないアプリケーションに対するシングル・サインオンの場合、ログイン資格証明を後処理プログラムに渡すことがあります。
passthrough:yes
を設定した場合、この設定により、Oracle Access Managerでフォームの後処理が実行されます。後処理が発生すると、Oracle Access ManagerにはリダイレクトURL(ユーザーがリクエストした元のURL)が記憶されません。そのため、passthrough:yes
を設定する場合は、フォームのアクションにランディング・ページも入力して、ランディング・ページを保護する必要があります。または、認証アクションを作成してユーザーをランディング・ページにリダイレクトすることも可能です。
デフォルトはpassthrough:no
です。この値を明示的に設定するか、フィールドを空白のままにしておきます。デフォルトのパススルー・モードをそのまま使用し、ユーザーを最初にリクエストしたリソース以外のページにリダイレクトする場合は、ポリシー・ドメイン・ルールで、認証成功時に別のページにリダイレクトするよう指定します。ログイン・フォームへのリダイレクションが実行され(「リダイレクション」を参照)、パススルー・モードがフォーム認証スキームに設定されていない場合、WebGateは最初にリクエストされたリソースにブラウザをリダイレクトします。ObRequestedUrlヘッダー変数をリダイレクトに使用できます。
注意: passthrough:yes を設定すると、パスワードがURL文字列で送信されます。ただし、この文字列は隠蔽される可能性があります。URLでのパスワードの送信を構成する前に、組織のセキュリティ・ポリシーを確認してください。 |
ログイン・フォームが、ユーザーがリクエストしたページである場合、リダイレクションは不要です。ただし、たとえばページをブックマークすることで、ユーザーはログイン・フォームの周辺のページの表示を試行できます。このような場合は、WebGateがリクエストをログイン・フォームにリダイレクトできます。認証が成功すると、WebGateは、リクエストされたリソースにユーザーを再びリダイレクトします。
obFormLoginCookieは、元のリクエスト情報を保持します。デフォルトでは、このCookieは、ブラウザが最初にフォームにリダイレクトされたときに設定されます。このCookieには次の情報が含まれます。
リクエストされたURL
リクエストされた操作
認証スキーム
返すホストのURL
このCookieがない場合、WebGateは認証時に、最初にリクエストされたリソースを送信できません。
ユーザーが認証されるときに、ObSSOCookieも設定されます。ObSSOCookieの詳細は、「シングル・サインオンのCookie」を参照してください。
フォーム認証スキームでは、ともに使用するプラグインがいくつか必要になります。プラグインの順序も重要です。
資格証明マッピングは、各ログイン・フォームに対して定義されます。credential_mappingプラグインは、ユーザー提供の資格証明を、ディレクトリ・サーバーの一意のDNにマッピングするタスクを実行します。WebGateでは、フォームの資格証明に一致する属性を持ったプロファイルをディレクトリから検索します。パスワード資格証明を、Basic認証と整合するように処理します。
論理的には、パスワード検証は、ユーザーが識別された後にのみ実行されます。したがって、credential_mappingプラグインは、validate_passwordの前に使用する必要があり、フォームを使用する認証スキームで最初に指定するプラグインである必要があります。
フォーム認証では、Basic認証で使用するものと同じvalidate_passwordプラグインを使用します。パスワード・フィールドの名前を構成できます。
Basic認証と同様に、カスタム認証プラグインを使用して、他のログイン・サービスおよびユーザー・リポジトリを使用したユーザー名およびパスワードをチェックできます。実際に、Basicおよびフォーム・ベースのユーザー名/パスワード認証で同じ処理機能を使用できます。カスタム認証プラグインは、他のユーザー資格証明データも処理できます。
注意: カスタム・プラグインを使用するフォーム・ベース認証時には、元のリソース名は、チャレンジ・パラメータcredsリストの事前定義名として使用できません。たとえば、認証プラグインAPIでは、ObAnPluginInfo構造体はCredsデータ型を含み、アクセス・サーバーはこのリストにResource、Operation、RequesterDNおよびRequesterIPの4つの事前定義名を提供します。フォーム・ベース認証の使用時にAPIによって返されるリソースは、元のURLの実際のリソースではなく、ログイン・フォームがPOSTする先のリソースです。 |
プラグインの詳細は、「フォーム・ベース認証スキームの構成」を参照してください。
WebGateがフォーム・ログインを捕捉すると、セッションCookieを作成し、認証アクションを実行できます。
注意: IIS上のフォーム認証スキームがパススルー・オプションにより構成され、ログイン・フォームのターゲットが、フォームによりポストされたデータを必要とする場合、WebGate拡張メソッド(WebGate DLLがフォームのアクションの場合)は使用できません。かわりに、WebGateのフィルタ・メソッド(フォームのアクションがWebGate DLLでない保護されたURLの場合)を使用する必要があり、postgate DLLをインストールして有効にする必要があります。詳細は、『Oracle Access Managerインストレーション・ガイド』を参照してください。 |
認証スキームは、リクエストをアクセス・サーバーに送信する前に、コンテキスト固有の情報を収集できます。コンテキスト固有の情報は、情報の外部コールの形を取ることができます。コンテキスト固有の情報のタイプには、次のものがあります。
server: 他のWebサーバー・プラグインで設定される変数
header: HTTPヘッダー変数
post: ポストされたデータ
query: 問合せ文字列データ
cookie: HTTP cookie
「新規認証スキームの定義」で説明されているように、認証スキームを作成します。
「チャレンジ・パラメータ」フィールドで、次のように指定します。
creds:source$name
または
creds:name
ここで、sourceは次のいずれかになります。
server
header
post
query
cookie
sourceを指定しない場合は、ソースはこのリストの順序で検索されます。
注意: Webサーバーのソース(サーバー・パラメータ)が他のソースより優先されます。これにより、ユーザーが設定するリクエスト・データがWebサーバーのデータをオーバーライドすることが防止されます。たとえば、ユーザーから送信されたremote_user Cookieは、Webサーバーによって設定されたremote_user変数を上書きしません。 |
クライアントがWebGateの場合は、Access Manager SDKとは異なり、WebGateでリクエストされたデータが抽出されます。クライアントがAccess Manager SDKの場合は、コール側のプログラムでこのデータを収集します。
プラグインでcredsパラメータを使用するには、ObUserSessionオブジェクトのobMap資格証明パラメータに何を渡すかを指定します。詳細は、『Oracle Access Manager開発者ガイド』を参照してください。
保護されたリソースにユーザーがアクセスするとき、そのことを示すカスタム・フォームを作成する必要があります。必要に応じて、いくらでも複雑なフォームを作成できます。フォームには、少なくともログイン名とパスワードを送信するフィールドが必要です。
フォーム設計時の主要な考慮点を次にあげます。
「ObFormLoginCookie」で説明されているObFormLoginCookie。
「フォーム・アクションの概要」で説明されているフォーム・アクション。
「Microsoft IISに関する注意」で説明されているフォーム・アクションおよびwebgate.dl。
ログイン・フォームのキャラクタ・セット・エンコーディングは、「サンプル・ログイン・フォーム」で示されているように、UTF-8に設定する必要があります。
先に説明したように、WebGateは、ブラウザが最初にフォームにリダイレクトされるときにObFormLoginCookieを設定します。これは、次の状況では問題になる場合があります。
ログイン・フォームが、匿名認証スキームによって保護されているパスワード管理へのリンクを持つ場合、ユーザーは「パスワードの紛失」リンクへはリダイレクトされず、ログイン・フォームに再びリダイレクトされます。
ログインが完了すると、WebGateはObFormLogin Cookieを完了としてマークし、同じブラウザ・インスタンスでのフォーム・ベース・ログインの再使用をユーザーに対して許可しません。これによって、oblogoutの機能に問題が発生します。ユーザーがログアウト試行後に再ログインすると、WebGateはフォームのログイン処理をバイパスします。
このような状況は、フォーム認証スキームの構成時に、アクション・チャレンジ・パラメータを入力することで回避できます。詳細は、「ポリシー・ドメインによるリソースの保護」を参照してください。
次の手順は、フォームおよびフォームに対する認証スキームを構成する方法を示しています。
「フォーム作成時の考慮点」で説明した点を考慮し、保護されたリソースにアクセスするときに、ユーザーに対して表示するカスタム・フォームを作成します。
フォームを、WebGateを持つWebサーバー上の、保護されていないディレクトリまたは匿名認証スキームで保護されているディレクトリに置きます。
同じログイン・フォームおよびそれに関連付けられた認証スキームを、複数のポリシー・ドメインで使用できます。
「フォーム・ベース認証の構成」で説明されているように、フォーム・ベース認証を構成します。
この項の残りの内容は次のとおりです。
認証スキームを作成するときには、名前、オプションの説明、認証スキームのレベルを含めます。パラメータおよびオプションは次の手順で説明します。認証スキームについては、第5章「ユーザー認証の構成」を参照してください。
注意: フォームがWebGateと同じサーバー上にある場合、認証スキームでフォームに指定された相対フォームURLは、WebGateと同じコンピュータ上にあります。この場合、認証スキームには、URLのhttps://(またはhttp://)host:port部分を含めません。ただし、フォームがリモート・サーバー上にある場合は、認証スキームにホストおよびポートが必要になります。 |
アクセス・システム・コンソールで、「アクセス・システム構成」→「認証管理」の順に選択し、次に「追加」をクリックします。
「新規認証スキームの定義」画面が表示されます。
認証スキームに対して、次の情報を入力します。
名前
説明
認証スキームのレベル: スキームのレベルは、このスキームの相対セキュリティ・レベルに対応します。レベルが高ければ、よりセキュアであるとみなされます。
「チャレンジ・メソッドの概要」で説明されているように、フォームをチャレンジ・メソッドとして選択します。
「チャレンジ・パラメータ」フィールドで、次のように入力します。
form:relative_form_URL
creds:credential_names
action:Action_URL
passthrough:[yes] (Optional)
アクセス・システムでは、認証スキームでフォームに指定された相対フォームURLは、WebGateと同じコンピュータ上にあると想定されます。
認証スキームがWebGateと同じコンピュータ上にある場合は、URLのhttp://
host
:
port
部分は使用しないでください。
次に例を示します。
form:/login.html
資格証明名は、フォームからの入力が予想される資格証明名の、スペース区切りのリストです。
次に例を示します。
creds:login password
アクションURLは、ObFormLoginCookieを、フォームがログイン資格証明をポストした場合にのみ返されるように設定します。
次に例を示します。
action:/access/dummy.cgi
詳細は、「フォーム・アクションの概要」を参照してください。
デフォルトのパススルー・モードは「いいえ」です。最初にリクエストしたリソースにユーザーを自動的にリダイレクトするよう、アクセス・システムを構成する場合は、デフォルトをそのまま使用します。
SSLを使用してユーザーを認証するどうかを指定します。
チャレンジ・リダイレクトを使用して、ユーザーをすべてのフォームが格納されている中央の場所にリダイレクトすることもできます。
SSLに対して「はい」を選択した場合は、セキュア・サーバーに対するチャレンジ・リダイレクトURLを指定します。
次の2つの必須プラグインを入力します。
順序 | プラグイン名 | プラグインのパラメータ |
---|---|---|
1 | credential_mapping | obMappingBase="o=company,c=us"(LDAP検索におけるベースDN)。obMappingFilter="[(Identity Login Attribute=%form input field for login %)]" |
2 | validate_password | ObCredentialPassword="[form input field for password]" |
警告: ディレクトリ・ログイン属性は、『Oracle Access Manager IDおよび共通管理ガイド』で説明されているように、セマンティック・ログイン・タイプを使用して、アイデンティティ・システムで定義される属性です。また、フィルタではスペースを使用できません。ポリシー・マネージャは、credential_mappingフィルタとして指定された文字列を検証しないため、エラーのあるフィルタを入力してしまう可能性があります。保存時にはエラーは発生しませんが、実行するたびにフィルタがエラーになり、プラグインで認証に失敗したというメッセージが返されます。 |
ユーザーおよびobMappingFilterについては、「obMappingFilterへのユーザーの挿入」を参照してください。
「保存」をクリックします。
フォーム・アクションは、認証のための資格証明を処理しません。資格証明の処理は、フォーム・ベース認証スキームに対して構成した、アクセス・システム・プラグインで行います。
ログイン・フォームのinput
要素で、name
属性の値は、チャレンジ・メソッドのcreds
パラメータに指定した値と一致する必要があります。ユーザーはこのフォームを使用してログインするとき、フォームのすべての資格証明を正確に入力する必要があります。正確に入力しないと、WebGateがユーザーをログイン・フォームにリダイレクトします。
ログイン・フォームのform
要素で、action
属性は、ユーザーがフォームを送信するときのフォーム・データのポスト先のURLです。
たとえば次のフォームでは、アクションURLは/access/dummyであり、メソッドはPOSTです。
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" > </head> <form name="myloginform" action="/access/dummy" method="post"> UserID <input type="text" name="userid" size="20" value="user1k1"> Password <input type="password" name="password" size="20" value="oblix"> <input type="submit" name="submit" value="Login"> </form> </html>
アクションURLは、WebGateがアクションURLパスに対してObFormLoginCookieを設定し、このCookieがフォームのポスト時にのみ返されるように構成されます。ユーザーが資格証明を送信すると、HTTP GETまたはPOSTメソッドを使用してフォーム・アクションがコールされます。フォーム・アクションは、認証のためのユーザーの資格証明を処理しません。資格証明の処理は、フォーム・ベース認証スキームに対して構成したプラグインで行います。
フォーム・アクションが、何も処理を行わないURLのコールである場合もあります。フォームがアクションURLをポストすると、WebGateはObFormLoginCookieによってポストを捕捉します。WebGateはポスト・データの資格証明を処理し、ユーザーを認証し、ObFormLoginCookieで示す、最初にリクエストされたURLにユーザーをリダイレクトします。アクションURLに達することはないため、実際は指定する必要はありません。必要なのは、ポリシーによるアクションURLの保護のみです。先のフォーム例では、アクションURLの/access/dummyは、/accessの下位にあるすべてのURLを保護するポリシー・ドメインによって保護されています。ただし、/access/dummyは、その名前が示すように実在しません。
フォーム・アクションが、認証後処理を行うスクリプトのコールである場合もあります。たとえば、ヘッダー変数を受け付けないアプリケーションに対するシングル・サインオンを実現するための、資格証明に関する後処理を行うスクリプトを持つことができます。フォーム・アクションがスクリプトの場合、認証スキームはチャレンジ・パラメータでpassthrough:yesを指定して構成する必要があります。これによって、WebGateに対して、アクションURLがフォーム・ログイン後に実行する必要のあるスクリプトであることが通知されます。この場合、WebGateは、ユーザーを最初にリクエストされたURLにはリダイレクトしません。WebGateはWebサーバーに対して、アクションURLの処理の続行を許可します。WebGateは、最初にリクエストされたURLをObRequestedURLヘッダー変数でアクションURLスクリプトに渡し、スクリプトにより必要に応じて元のURLにリダイレクトできます。
注意: フォーム・アクションURLは、アクセス・システムによって保護されたポリシー・ドメインにある必要があります。 |
フォームがWebGateと同じサーバーにある場合、送信アクションはローカル・ホストが使用されていることを想定します。ただし、フォームがWebGateとは別のサーバー上にある場合は、フォームの送信アクションは、WebGateが置かれているWebサーバーにデータを返す必要があります。
IISアーキテクチャのため、WebGate ISAPIプラグインは、データ後処理のすべての受信リクエストをチェックします。次のいずれかを実行する必要があります。
次のようなwebgate.dllをコールする独自のフォーム・アクションを設定します。
action="/access/oblix/apps/webgate/bin/webgate.dll"
次のレジストリ・エントリを設定し、WebGateフィルタの後処理を確実に有効にします。
HKEY_LOCAL_MACHINE\SOFTWARE\Oblix\Oblix COREid\version\WebGate\postdata="yes"
ここで、versionはインストールされている製品のバージョン番号です。
内容は次のとおりです。
アクティブなユーザーのみがログインできるようにするため、アクティブなユーザーのみをobMappingFilterに含めるとします。このタスクでは、obuseraccountcontrol=ACTIVATEDのユーザーをフィルタ処理する必要があります。
アクティブなユーザーのみをobMappingFilterへ挿入する手順
「フォーム・ベース認証スキームを構成する手順」に従って処理を行います。
マッピング・フィルタで、アクティブなユーザーのみを指定します。次に例を示します。
obMappingFilter="(&(objectclass=wwmOrgPerson) (uid=%loginid%) ( | ( ! (obuseraccountcontrol=*)) (obuseraccountcontrol=ACTIVATED)))"
注意: Oracleのサンプル・データ(wwmOrgPerson)を使用する例で説明しています。このオブジェクト・クラスを、サイト固有のオブジェクト・クラスに変更します。uid=%loginid%は、フォームにloginidという名前のフィールドがあり、この値がcredsフィールドにも含まれることを想定しています。 |
非アクティブなユーザーがログインできないようにするため、非アクティブなユーザーをobMappingFilterに含めるとします。このタスクでは、ステータスがobuseraccountcontrol=PENDING-ACTIVATIONまたはPENDING DEACTIVATEDのユーザーをフィルタ処理します。
非アクティブなユーザーのみをobMappingFilterに挿入する手順
「フォーム・ベース認証スキームを構成する手順」に従って処理を行います。
マッピング・フィルタで、非アクティブなユーザーを指定します。次に例を示します。
obMappingFilter="(&(objectclass=wwmOrgPerson) (uid=%userid%)(!(| (obuseraccountcontrol= PENDING-ACTIVATION)(obuseraccountcontrol=DEACTIVATED) (obuseraccountcontrol=PENDING-DEACTIVATION))))"
注意: Oracleのサンプル・オブジェクト・クラスwwmOrgPersonを使用する例で説明しています。このオブジェクト・クラスを、サイト固有のオブジェクト・クラスに変更する必要があります。uid=%loginid%は、フォームにloginidという名前のフィールドがあり、この値がcredsフィールドにも含まれることを想定しています。 |
次の各項では、フォーム・ベース認証で使用可能なフォームの例を示します。
HTMLフォームおよび対応する認証スキームの例は次のとおりです。
次に非常にシンプルなログイン・フォームを示します。
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" > </head> <h1>My Login Form</h1> <form name="loginform" action="/oblix/login.cgi" method="post"> Login ID: <input type="text" name="login" size="20" value=""> <p> Submit:<input type="submit" name="submit" value="OK"> <p> Password:<input type="password" name="password" value=""> </form> </html>
次に、もう1つのサンプル・ログイン・フォームの例を示します。これはフォーム・ログイン認証スキームの最小要件を示しています。実際のログイン・フォームは、見た目を考慮し、また商標などを付加して拡張できます。このフォームを使用する認証スキームの例は次のとおりです。
名前: サンプル・フォーム・ログイン
説明: SampleLoginForm.htmlを使用
レベル: 1
チャレンジ・メソッド: Form
チャレンジ・パラメータ:
form: /loginforms/SampleLoginForm.html
creds: -userid password
action: /access/oblix/apps/webgate/bin/webgate.dll
SSL必須: いいえ
チャレンジ・リダイレクト: (なし)
有効: はい
プラグイン:
credential_mapping obMappingBase="o=Company,c=US", obMappingFilter="(&(&(objectclass=gensiteorgperson) (uid=%userid%))(| (!(obuseraccountcontrol=*)) (obuseraccountcontrol=ACTIVATED)))" validate_password obCredentialPassword="password
Active Directoryについては、オブジェクト・クラスの場合はuser、ログインの場合はsamaccountnameを使用します。次に例を示します。
credential_mapping for Active Directory obMappingBase="ou=Hokaido,dc=perry,dc=oblix,dc=com", obMappingFilter="(& (&(objectclass=user)(samaccountname=%login%) )(|(!(obuseraccountcontrol=*)) (obuseraccountcontrol=ACTIVATED)) )"
ログイン・フォームは、保護されないか、「チャレンジ・メソッド」が「なし」の認証スキームによって保護される必要があります。これにより、ユーザーがログイン・フォームにリダイレクトされたときに再度入力を求められることがなくなります。サンプル・スキームに対しては、匿名認証スキームを使用してフォームを保護するポリシー・ドメインを構成できます。これにより、ログイン・フォームが表示されると、一時的にObSSOCookieが設定されます。ObSSOCookieは、ログイン成功後に再び書き込まれます。
サンプル・スキームでは、ユーザーIDはユーザーのディレクトリ・プロファイルからのuid属性です。credential_mappingプラグインは、o=Company,c=USに基づいてユーザー・ディレクトリを検索します。credential_mappingプラグインは、送信されたユーザーIDと一致するuidを含むgensiteorgpersonオブジェクトを検索します。ObMappingFilterの追加情報によって、ユーザーがアクティブにされるかどうかが決まります。validate_passwordプラグインは、送信されたパスワードと、credential_mappingプラグインがディレクトリを検索したときに取得したユーザー・プロファイルDNを使用して、ディレクトリへのBINDを実行します。
アクションは、WebGateのローカルURLです。このURLは、なんらかの認証スキームを使用して保護する必要があります。たとえば、ポリシー・マネージャの設定時にオプションで作成する、ポリシー・マネージャ・ポリシー・ドメインを使用します。
IISの場合、WebGateアクションはISAPI拡張として実行されるため、資格証明を含むポスト・データを安全に取得できます。他のWebサーバーの場合は、(アクションURLが保護されているため)WebGateがポスト・リクエストを捕捉し、認証のためのポスト・データを抽出します。WebGateは、アクション・チャレンジ・パラメータをパスとして使用し、ObFormLoginCookieを設定します。これによって、ObFormLoginCookieは、フォーム送信からのポスト・リクエストの場合にのみ返されるようになります。ObFormLoginCookieは、最初にリクエストされたリソースに関する情報を含みます。認証が成功すると、WebGateはこの情報を使用して、最初にリクエストされたリソースにユーザーのブラウザをリダイレクトします。リダイレクション時には、WebGateはObSSOCookieにユーザーID、認証スキーム・レベル、セッション開始時間とリフレッシュ時間、およびブラウザのIPアドレスを設定します。
サンプル・ログイン・フォーム
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>Oracle Access Manager Sample Login Form</TITLE> <META http-equiv=Content-Type content="text/html; charset=utf-8"> <META content="MSHTML 6.00.2800.1226" name=GENERATOR> </HEAD> <BODY> <H2>Oracle Access Manager Sample Login Form</H2> <FORM name=SampleLoginform action=/access/oblix/apps/webgate/bin/webgate.dll method=post> UserID <INPUT name=userid> Password <INPUT type=password name=password> <INPUT type=submit value=Login name=submit> </FORM> </BODY> </HTML>
WebGateでは、リリース10.1.4からはUTF-8でエンコードされた入力データのみを受信します。このことから、フォーム・ベース認証は、非ASCIIのログイン証明書(ユーザー名/パスワード)をサポートします。フォーム・ベース認証を10gリリース3(10.1.4)のWebGateで使用するには、ログイン・フォームのキャラクタ・セット・エンコーディングをUTF-8に設定する必要があります。
UTF-8へエンコーディングするログイン・フォームの設定方法
次のMETAタグを、ログイン・フォームHTMLページのHEADタグに追加します。
<META http-equiv="Content-Type" content="text/html;charset=utf-8">
以前のWebGateを10.1.4にアップグレードする場合は、アップグレード後にログイン・フォームのHTMLページも更新する必要があります。
次のJSPおよびASPコード・サンプルは、ポップアップ・ログイン・フォームを作成します。これによって、ログイン・フォームがフレームセット内にフレームとして含まれる場合に発生する可能性がある問題が回避されます。JSPコードは、JSPサーブレット・エンジンを持つWebサーバーで使用する必要があります。ASPコードは、IIS、またはASPエンジンを持つ別のWebサーバーで使用する必要があります。
これらのログイン・ポップアップ例のどちらかを使用する場合は、次のチャレンジ・パラメータのいずれかを使用して、認証スキームを構成する必要があります。
form:login/login.asp
(ASPフォームが/loginフォルダに格納されていると想定)
または
form:login/login.jsp
(JSPフォーム用)
JSPコード・サンプル
<%@ page import="java.util.*" %> <% int launchStatus = -1; String URLVal = ""; String HTTPStart = "http://"; String QueryStr = request.getQueryString(); String ServerName = request.getServerName(); String PathName = request.getServletPath(); if (QueryStr != null) { if (QueryStr.indexOf("launchForm") == -1) { launchStatus = -1; } else { launchStatus = 0; } URLVal = HTTPStart.concat(ServerName); URLVal = URLVal.concat(PathName); URLVal = URLVal.concat("?"); URLVal = URLVal.concat(QueryStr); URLVal = URLVal.concat("&launchForm=TRUE"); } else { URLVal = HTTPStart.concat(ServerName); URLVal = URLVal.concat(PathName); URLVal = URLVal.concat("?launchForm=TRUE"); } if ((launchStatus != 0)) { %> <HTML> <HEAD> <SCRIPT Language="Javascript"> function openLoginForm() { newUrl = "<%= URLVal %>"; child = window.open(newUrl, "loginFormWindow", "toolbar=no,directories=no,menubar=no,status=no,scrollbar=no,resizable=yes,widt h=670,height=400"); if (child.opener == null) { child.opener = window; } window.name = "loginOpener"; if (navigator.appName == "NetScape") { child.focus(); } } </SCRIPT> </HEAD> <BODY bgcolor="#ffffff" onload="openLoginForm(); return true;"> <center> <p> <hr> <p> <Font face="verdana" size="2"> Please enter your login credentials </Font> <p> <hr> <p> </center> </BODY> </HTML> <%} else %> <html> <script language="JavaScript"> function setAction() { document.forms[0].target=self.opener.name; document.forms[0].submit(); window.close(); } </script> <body> <center> <h1>User Login</h1> <br> <br> <form name="frmlogin" action="/FormProtect/login.cgi" method="post" target="loginOpener"> <hr> <b>User ID </b><input type="text" name="txtUserID"> <br> <b>Password </b><input type="password" name="pwdPassword"> <br> <input type="button" title="Login" onclick="javascript:setAction(); " value=Submit> <hr> </center> </form> </body> <html>
ASPコード・サンプル
<% dim launchForm launchForm = Request("launchForm") if launchForm <> "True" then 'This is the plain/blank HTML page %> <HTML> <HEAD> <SCRIPT Language="Javascript"> function openLoginForm() { // now open the new window with newUrl <% if len(request.servervariables("QUERY_STRING")) > 0 then %> newUrl= "<%=request.servervariables("URL") & "?" & request.servervariables("QUERY_STRING") & "&launchForm=True"%>"; <% else %> newUrl= "<%=request.servervariables("URL") & "?launchForm=True"%>"; <% end if %> child = window.open(newUrl, "loginFormWindow", "toolbar=no,directories=no,menubar=no,status=yes,scrollbar=yes,resizable=yes,wi dth=670,height=400"); if (child.opener == null) { child.opener = window; } window.name = "loginOpener"; if (navigator.appName == "NetScape") { child.focus(); } } </SCRIPT> </HEAD> <BODY bgcolor="#ffffff" onload="openLoginForm(); return true;"> <center> <p> <hr> <p> <Font face="verdana" size="2"> Please enter your login credentials </Font> <p> <hr> <p> </center> </BODY> </HTML> <% else %> <HTML> <SCRIPT language="JavaScript"> function setAction() { document.forms[0].target=self.opener.name; document.forms[0].submit(); window.close(); } </SCRIPT> <BODY> <CENTER> <H1>User Login</H1> <BR> <BR> <form name="frmlogin" action="/FormProtect/login.cgi" method="post" target="loginOpener"> <HR> <B>User ID </B><input type="text" name="txtUserID"> <BR> <B>Password </B><input type="password" name="pwdPassword"> <BR> <input type="button" title="Login" onclick="javascript:setAction(); " value=Submit> <HR> </CENTER> </FORM> </BODY> <HTML> <% end if %>
非ASCIIのユーザー資格証明は、フォーム・ベース認証でのみサポートされます。
次のASPコード・サンプルは、スペイン語と英語の両方をサポートするマルチ言語フォームです。
<% Option explicit dim strLanguage, strNewLanguage, intPointer dim bolLoginToCOREid bolLoginToCOREid = Request("LoginToCOREid") if bolLoginToCOREid = true or bolLoginToCOREid = "true" then bolLoginToCOREid = true else bolLoginToCOREid = false end if strLanguage = Request.Cookies("PrefLang") 'Response.Write "lenguaje:" & strLanguage if strLanguage = "" or strLanguage = "EN" then strLanguage = "EN" strNewLanguage = "SP" intPointer = 0 else strLanguage = "SP" strNewLanguage = "EN" intPointer = 1 end if dim strUser(1),strPassword(1),strEnter(1),strPreferences(1),strCancel(1) dim strLanguageDescription(1),strForgot(1),strDescription(1),strMsgUandP(1),strMsgU (1) dim strUserType(1),strCOREidUser(1),strCOREidAdmin(1) strUser(0) = "User:" strUser(1) = "Usuario:" strPassword(0)="Password:" strPassword(1)="Contraseña:" strEnter(0) = "Enter" strEnter(1) = "Proceder" strPreferences(0)="Preferences" strPreferences(1)="Preferencias" strCancel(0)="Cancel-Portada" strCancel(1)="Cancelar-Portada" strLanguageDescription(0)="Espanol" strLanguageDescription(1)="English" strForgot(0)="Forgot your password?" strForgot(1)="¿Olvidó su contraseña?" strMsgUandP(0)= "Please enter your user name and password." strMsgUandP(1)= "Por favor teclee su usuario y contraseña." strMsgU(0)= "Please enter your user name."
strMsgU(1)= "Por favor teclee su usuario." strUserType(0) = "User Type:" strUserType(1) = "Tipo de Usuario:" strCOREidUser(0) = "Oracle Access Manager User" strCOREidUser(1) = "Usuario Oracle Access Manager" strCOREidAdmin(0)= "Oracle Access Manager Admin" strCOREidAdmin(1) = "Administrador Oracle Access Manager" strDescription(0)="Click ""Preferences"" to see and modify some of your attributes." & _ "<p>Da un clic en ""Español"" para cambiar esta pagina de idioma." & _ "<p>Click ""Forgot your password?"" if you don't remember your password and you need to change it, " & _ "you will be prompt to answer your challenge phrase." strDescription(1)="Da un clic en ""Preferencias" " para ver y modificar algunos de tus atributos." & _ "<p>Click on ""English"" to change the language of this page." & _ "<p>Da un clic en ""¿Olvidó su contraseña?" " si no recuerdas tu clave y deseas cambiarla, " & _ "será necesario contestar tu frase personal."
dim identityProgram dim userDN dim finalURL identityProgram="/identity/oblix/apps/userservcenter/bin/ userservcenter.cgi?program=modify&tab_id=Employees" userDN = Request.ServerVariables("HTTP_USERDN") finalURL = identityProgram & "&uid=" & userDN dim obTemp dim ObSSO dim ObLogin ObSSO = "ObSSOCookie=loggedout; path=/; domain=.oblix.com" Response.Cookies("ObFormLoginCookie") = "done 1" Response.Cookies("ObFormLoginCookie").Expires = Date() - 1 obtemp = "ObTEMP=%23comp_cookie=false%23; path=/" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0018)http://10.26.3.90/ --> <HTML><HEAD> <TITLE>Login</TITLE> <meta http-equiv="pragma" content="no-cache"> <%if bolLoginToCOREid then%> <meta http-equiv="Set-Cookie" content="<%=ObLogin%>" <%end if%> <META http-equiv=Content-Type content="text/html; charset=utf-8"> <SCRIPT LANGUAGE=javascript> <!-- //Functions for keydown nextfield = "login"; netscape = ""; ver = navigator.appVersion; len = ver.length; for(iln = 0; iln < len; iln++) if (ver.charAt(iln) == "(") break; netscape = (ver.charAt(iln+1).toUpperCase() != "C"); function keyDown(DnEvents) { k = (netscape) ? DnEvents.which : window.event.keyCode; if (k == 13) { if (nextfield == 'done') { setAction(); }else{ eval('document.loginform.' + nextfield + '.focus()'); return; } } } document.onkeydown = keyDown; if (netscape) document.captureEvents(Event.KEYDOWN|Event.KEYUP); //\Functions for keydown expireDate = new Date expireDate.setFullYear(expireDate.getFullYear()+7) var URLs = new Array(2); URLs[0] = "/identity/oblix/apps/userservcenter/bin/ userservcenter.cgi?usertype=delegatedIdentityAdminBIZ"; URLs[1] = "/identity/oblix/apps/admin/bin/ front_page_admin.cgi?usertype=systemAdmin"; function setCookie (name, value, expires) { document.cookie = name + "=" + escape (value) + "; expires=" + expireDate.toGMTString() + "; path=/"; } function delCookie (name) { var expireNow = new Date(); document.cookie = name + "=" + "; expires=Thu, 01-Jan-70 00:00:01 GMT" + "; path=/"; } function changeLanguage(){ setCookie("cemexPrefLang","<%=strNewLanguage%>"); document.location.reload(true); } // Delete the cookie function deletecookie(){ if (document.cookie != "") { thisCookie = document.cookie.split("; ") expireDate = new Date expireDate.setDate(expireDate.getDate()-1) for (i=0; i<thisCookie.length; i++) { cookieName = thisCookie[i].split("=")[1] document.cookie = "cookieName="+cookieName + ";expires=" + expireDate.toGMTString(); } } } function killObCokies(){ // Kill Any Cookies... document.cookie = "<%=obSSO%>" document.cookie = "<%=obLogin%>" //document.cookie = "ObTEMP=; path=/"; //delCookie("ObSSOCookie"); //delCookie("ObFormLoginCookie"); //delCookie("ObTEMP"); } function mySubmit() { if (!((loginform.login.value.length > 0) && (loginform.password.value.length > 0))) { alert("<%=strMsgUandP(intPointer)%>"); return; } // Kill Any Cookies... killObCokies(); //document.cookie = "ObSSOCookie=loggedout; path=/; domain=.cemexnetlab.com" document.location.reload(true); document.cookie = "<%=obTemp%>"; myWindowHandle = window.open ('about:blank','myWindowName','scrollbars=yes,width=600,height=500'); loginform.action="/identityredirect/redirector.asp"; // loginform.action="/identity/oblix/apps/userservcenter/bin/ userservcenter.cgi?program=modify&usertype=endUser"; loginform.target="myWindowName"; loginform.submit(); } function setAction() { if (!((loginform.login.value.length > 0) && (loginform.password.value.length > 0))) { alert("<%=strMsgUandP(intPointer)%>"); document.loginform.login.focus(); return; } killObCokies(); // Kill Any Cookies... document.cookie = "<%=obTemp%>"; <%if bolLoginToCOREid then%> loginform.action = eval ("URLs["+loginform.selectName.options[loginform.selectName.selectedIndex].value +"]"); <%else%> loginform.action="/access/oblix/apps/webgate/bin/webgate.dll"; <%end if%> loginform.target=""; loginform.submit(); } function lost() { if (!(loginform.login.value.length > 0)) { alert("<%=strMsgU(intPointer)%>"); return; } // Kill Any Cookies... killObCokies(); myWindowHandle = window.open ('about:blank','myWindowName','scrollbars=yes,width=600,height=500'); loginform.action="/identity/oblix/apps/lost_pwd_mgmt/bin/ lost_pwd_mgmt.cgi"; loginform.target="myWindowName"; loginform.submit(); } --> </SCRIPT> </HEAD> <BODY leftMargin=0 topMargin=0 scrolling="no"> <%if bolLoginToCOREid then%> <form name="loginform" action="/identity/oblix/apps/userservcenter/bin/ userservcenter.cgi?usertype=delegatedIdentityAdminBIZ" method="post"> <%else%> <form name="loginform" action="/access/oblix/apps/webgate/bin/webgate.dll" method="post"> <%end if%> <input type="hidden" name="ObLoginDomain" value="dc=oblix,dc=com"> <TABLE cellSpacing=0 cellPadding=0 width=763 align=center border=0> <TBODY> <TR vAlign=top> <TD width="39%" colSpan=2> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD vAlign=top width="99%" bgColor=#cc0033> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD align=left><B><FONT face="Verdana, Arial, Helvetica, sans-serif" color=#ffffff size=2>Login</FONT></B> </TD> </TR></TBODY> </TABLE> </TD> </TR> <TR> <TD> <TABLE cellSpacing=0 cellPadding=0 width=255 border=0> <TBODY> <TR> <TD align=middle colSpan=3> <TABLE width="90%" border=0> <TBODY> <TR> <TD align=right width="50%"><FONTclass=classBold> <%=strUser(intPointer)%> </FONT> </TD> <TD align=left width="50%"> <input type="text" name="login" size="16" onFocus="nextfield='password';" value=""> </TD></TR> <TR> <TD align=right width="50%"><%=strPassword(intPointer)%> </TD> <TD align=left width="50%"> <input type="password" name="password" onFocus="nextfield='done';" value="" size="16"> </TD></TR> <%if bolLoginToCOREid then%> <TR> <TD align=right width="50%"> <%=strUserType(intPointer)%> </TD> <TD align=left width="50%"> <select name="selectName"> <option selected value="0"><%=strCOREidUser(intPointer)%> </option> <option value="1"><%=strCOREidAdmin(intPointer)%> </option> </select> </TD></TR> <%end if%> <TR> <TD colSpan=2> <A href="javascript:setAction();"><%=strEnter(intPointer)%> </A> <A href="javascript:mySubmit();"> <%=strPreferences(intPointer)%></A> <A href="javascript:loginform.reset();"> <%=strCancel(intPointer)%></A> </TD></TR> <TR> <TD colSpan=2> </TD></TR> <TR> <TD align=right colSpan=2> <A href="javascript:changeLanguage();"> <%=strLanguageDescription(intPointer)%></A> </TD></TR> <TR> <TD class=classNormal align=right colSpan=2> <A href="javascript:lost()"><%=strForgot(intPointer)%></A> </TD></TR></TBODY> </TABLE></TD></TR></TBODY> </TABLE></TD></TR></TBODY> </TABLE></TD> <TD width="1%"></TD> <TD width="60%"> <TABLE border=0> <TBODY> <TR> <TD class=classBold width="100%"> <P> <%=strDescription(intPointer)%> </TD></TR></TBODY></TABLE> </FORM> <DIV id=logoQA><IMG src="login_files/QA.gif"> </DIV> <SCRIPT LANGUAGE=javascript> <!-- document.loginform.login.focus(); --> </SCRIPT> </BODY> </HTML>
トラブルシューティングの詳細は、付録E「Oracle Access Managerのトラブルシューティング」を参照してください。