EGL シングル・サインオン

アプリケーション認証とプロキシー認証の結合

EGL シングル・サインオン を使用すると、アプリケーションへの認証 (カスタム・セキュリティーによって保護) と EGL Rich UI プロキシーへの認証 (JEE セキュリティーによって保護) というセキュリティーの側面を単一ステップに結合できます。 Web サービスへの認証を含めることもできます。

アプリケーション、EGL Rich UI プロキシー、および Web サービスへの認証に使用するユーザー・レジストリーが同じである必要はありませんが、認証エラーを防ぐには、EGL シングル・サインオンの際に使用されるユーザー ID とパスワードが、関連するすべてのユーザー・レジストリーに存在している必要があります。

EGL シングル・サインオンを 行うには、Rich UI アプリケーションで、ユーザー ID フィールド、パスワード・フィールド、 およびコマンド・ボタンを持つ、次の例のようなログイン画面を定義する必要があります。
useridLabel TextLabel { text = "User ID:", width = 80 };
useridField TextField { width = 100 };
useridBox  Box { children = [ useridLabel, 
                 useridField ], margin = 3 };
passwordLabel TextLabel { text = "Password:", width = 80 };
passwordField PasswordTextField { width = 100 };
passwordBox Box { children = [ passwordLabel, 
                  passwordField ], margin = 3};
button Button { text = "Log in", onClick ::= authenticate };
ui Box { background = "blue",
         children = [ useridBox, passwordBox, button ], 
         columns = 1, width = 200 };

Web サービスを呼び出すと、 要求が必ず EGL Rich UI プロキシーに送信されます。JEE 基本認証によってプロキシーが保護されているため、ユーザーはプロキシーにアクセスする前にログインが必要です。ユーザーがまだログイン していないときは、Web サービスを最初に呼び出すときに、『基本認証を使用した EGL Rich UI プロキシーの保護』に示されている例のような、ブラウザー提供のログイン・ダイアログが表示されます。

EGL シングル・サインオンの場合は、上記のユーザー定義ログイン画面を 使用してユーザーが Rich UI アプリケーションに対する認証を行うときに、プロキシーに対する 認証にも使用するために、EGL がその資格情報 (ユーザー ID およびパスワード) を JEE セキュリティー に渡します。 したがって、アプリケーションに対する認証とプロキシーに対する認証が結合されて 1 ステップに なります。EGL シングル・サインオンが機能するには、アプリケーションに対する認証を行う Web サービスが、他のいずれの Web サービスよりも前に呼び出されるよう Rich UI アプリケーションを設計してください。そうすることで、ブラウザー提供のログイン・ダイアログが迂回されます。

EGL シングル・サインオンを実装するには、ServiceLib.setProxyBasicAuthentication() システム関数を使用して、プロキシーに対する認証のためのユーザー ID とパスワードを渡します。アプリケーションにログインするための サービスを呼び出す前に、このシステム関数を呼び出してください。 上記の EGL コードに対する認証関数は、次の例のようになります。
function authenticate( e Event in )
   ServiceLib.setProxyBasicAuthentication(useridField.text,passwordField.text );
   srvc LDAPLoginService{ @bindService };
   call srvc.login( useridField.text, passwordField.text )
                    returning to loginCallback onException loginException;
end   

Web サービス認証の追加

通常、セキュア Web サービスに対する認証 を行うには、Rich UI アプリケーションで、ユーザーにユーザー ID とパスワードを要求する プロンプトを出す必要があります。ただし、EGL シングル・サインオンのために使用するユーザー ID およびパスワードは、セキュア Web サービスに渡すことができます。これを行うには、セキュア Web サービスを呼び出す前に ServiceLib.setHTTPBasicAuthentication() システム関数を呼び出し、EGL シングル・サインオンのためのユーザー ID およびパスワードをこの関数に渡します。
function withdraw( e Event in )
   ServiceLib.setHTTPBasicAuthentication(srvc, useridField.text,
                                         passwordField.text );
   srvc BankingService{ @bindService };
   call srvc.withdraw( useridField.text, passwordField.text )
                       returning to withdrawCallback onException withdrawException;
end

認証エラーの処理

EGL シングル・サインオンを使用してアプリケーションに対する認証と EGL Rich UI プロキシーに対する認証を行うときは、アプリケーションに対する認証の前にプロキシーに対する認証を行います。 EGL Rich UI プロキシーは、JEE 基本認証を使用して保護されるため、 アプリケーションではなく、Web コンテナーがログインの失敗を処理します。Web コンテナー が介入するため、単一ステップによって認証できなくなります。 この時点で、ユーザーはまず EGL Rich UI プロキシーに対する認証を行う必要があり、その後、 アプリケーション、Web サービス、またはこの両方にログインします。

ログイン画面で ユーザーが EGL Rich UI プロキシーに対する認証のために入力したパスワードが無効な場合は、 再度認証を試行できるよう、ブラウザー提供のログイン・ダイアログが表示されます。 JEE 基本認証では、ユーザーが正常にログインするまで、このダイアログを表示するように Web コンテナーがブラウザーに求めます。アプリケーションでは、ユーザーがこのダイアログ で入力するパスワードにアクセスできません。

ユーザーは、EGL Rich UI プロキシーに 対する有効な資格情報を入力した後で、アプリケーション、Web サービス、またはこの両方に 対する認証を行う必要があります。アプリケーションは、ユーザー定義のログイン画面に 有効なユーザー ID とパスワードを入れ直して「ログイン」ボタンを再度クリックするよう、 ユーザーに指示する必要があります。

HTTP 基本認証によって保護されている Web サービスに対してユーザーが認証するときにエラーが発生した場合は、call ステートメントで 指定されている例外ハンドラーに制御が移ります。 Rich UI アプリケーションでは、このエラーを検出し、再認証するための適切な指示をユーザーに 表示する必要があります。この種類のエラーの仕様書の例を以下に示します。

Web サービス認証エラー

構成
Web サービスは JEE 基本認証を使用して保護されています。
問題
Web サービスのための有効なユーザー ID およびパスワードが HTTP ヘッダーに見つかり ません。
エラー
ServiceInvocationException がメッセージ ID 「EGL1539E」でスローされ、 メッセージ「サービスとの通信中に例外が発生しました。URL: {0} (URL: {0})」が発行されます。この {0} は、Web サービスの URL です。ServiceInvocationException の detail1 には、 「401」が設定されます。detail2 には、「非許可」が設定されます。detail3 には、「"サーバーは URL: {0} に対して HTTP 応答コード: 401 を戻しました", "名前": "egl.core.ServiceInvocationException" ("Server returned HTTP response code: 401 for URL: {0}", "name": "egl.core.ServiceInvocationException")」が設定されます。
ソリューション
Web サービスをコンシュームする前に ServiceLib.setHTTPBasicAuthentication() を呼び出して、有効なユーザー ID とパスワードを HTTP ヘッダーに設定します。

EGL Rich UI プロキシーの認証と Web サービスの認証の両方に 成功しているものの、アプリケーションへの認証を試行したときにエラーが発生した場合は、Rich UI アプリケーションでエラーを処理する必要があります。Web サービスから復帰すると、 制御はコールバックに渡されるか、call ステートメントに指定された「returning to」関数に渡されます。


フィードバック