シングル サイン オン (SSO) によって、分散した複数の Web アプリケーションに対する一元化された認証が実現します。
複数の GeneXus Web アプリケーションを同じブラウザーで実行している場合、ユーザーは、最初のアプリケーションでログイン認証を要求されたときに、1 回認証するだけで済みます。
そのセッションが有効な間は、別の Web アプリケーションに切り替えた後でも、ユーザーは資格情報を再度入力する必要がありません。ログインは、同じブラウザーインスタンス (異なるタブ) で実行中のすべての Web アプリケーションに対して有効です。
このシナリオでは、関係するすべての Web アプリケーションが
GeneXus Access Manager (GAM) を使用する必要があります。また、アプリケーションの 1 つが ID プロバイダー (ユーザーの ID および資格情報を所有するサーバー。ユーザーが認証に使用します) として設定されている必要があります。
ID プロバイダーである GAM は、別のアプリケーションの認証に使用されます (ID プロバイダーである Facebook、Twitter、および Google での仕組みと同じです)。
App1、App2、App3 という 3 つの Web アプリケーションがあるシナリオについて考えてみましょう: App2 を、ID プロバイダーアプリケーションとします。
次の図は、ユーザーが他のいずれかのアプリケーションの非公開オブジェクトの実行を試みた場合のフローを示しています。
この図では、ユーザーが App1 の非公開オブジェクトの実行を試み、それが ID プロバイダーアプリケーションである App2 にリダイレクトされます (図のステップ 1 とステップ 2)。
その後、ログイン画面が表示され、そこで資格情報を入力すると、App1 へ自動的にリダイレクトされます。
App1 にログインした後で、ユーザーが同じ Web ブラウザーから App3 の非公開オブジェクトの実行を試みると、ID プロバイダー App2 にリダイレクトされます。セッションが有効な場合 (既に有効なセッションがあります)、ログイン画面は表示されずに App3 へのアクセスが可能です。次の図を参照してください:
これは Facebook や Twitter での処理とよく似ています。ユーザーがこれらのサイトのいずれかにログインすると、それを ID プロバイダーとして使用するアプリケーションは、同じブラウザーで実行されている場合、同じ有効なセッションを使用します。
SSO を設定するには、クライアントがサーバーに対して認証を行うことができるよう、クライアント側で GAM を設定するとともに、サーバー側でも GAM を設定します。
サーバー側で、クライアント側の GAM アプリケーションと同じ資格情報を必要とする
GAM アプリケーションを定義する必要があります。クライアント側では、下記で説明する GAM のリモート認証タイプを定義する必要があります。
1.GAM ID プロバイダーの設定
2.クライアントアプリケーションの設定
手順 1 および 2 については、「
GAMRemote 認証タイプ」を参照してください。
3.クライアントアプリケーションでの GAM ログインオブジェクトの設定
各クライアントアプリケーションで、
[ Login Object for Web ] プロパティを
GAMExampleSSOLogin オブジェクトに設定できます。このオブジェクトは、ユーザーが有効なセッションを保持しているかどうかをチェックします。保持していない場合は、リモート ログイン メカニズムがトリガーされます。これは
GAM - Examples と一緒に配布されます。
[ Login Object for Web ] プロパティ
1 つの方法は、GAM データベースをクライアントアプリケーションごとに 1 つと ID プロバイダー用に 1 つ準備することです。もう 1 つの方法は、GAM データベースを 1 つだけ準備し、それぞれに異なるリポジトリを使用することです。
GeneXus 15 Upgrade 11 以降では、さらに別の方法でこのソリューションをモデル化できます。つまり、GAM データベースを 1 つだけ準備し、すべてに同じ GAM リポジトリを使用できます。詳細については、
SAC #43517 を参照してください。この場合、
GAM のインパーソネーションを使用する必要があります。
1 つの方法として、
[ Login Object for Web ] プロパティを
GAMExampleSSOLogin に設定します。
この場合、ユーザーが非公開オブジェクトを実行しようとすると、
GAMExampleSSOLogin オブジェクトが自動的に実行されます。
GAMExampleSSOLogin は、ユーザーに有効なローカルセッションがあるかどうかをチェックし、有効なセッションがない場合は、リモート認証を実行します。
GAMExampleSSOLogin オブジェクトの次のコードは、1 つの
GAMRemote 認証タイプのみがリポジトリで定義されている場合にのみ有効です。
GAMRepository.LoginGAMRemote()
複数の GAMRemote 認証タイプが定義されている場合は、コードを変更する必要があります:
&GAMLoginAdditionalParameters.AuthenticationTypeName = "gam-remote-2"
&LoginOK = GAMRepository.Login(&UserName, &UserPassword, &GAMLoginAdditionalParameters, &GAMErrors )
リモート認証では、ID プロバイダーに接続して、ユーザーの有効なセッション (存在する場合) を取得するか、またはログインウィンドウを開いてユーザーに資格情報を入力させます。
この場合、ユーザーに表示されるログインは、サーバーの設定で
Local login URL に指定されたオブジェクトです (
1)。一般的に、このためには
gam_idplogin が使用されます。
ユーザーが ID プロバイダーアプリケーションによって提供された有効なセッションを保持している場合は、クライアントアプリケーションに直接リダイレクトされます。
もう 1 つの方法としては、
[ Login Object for Web ] プロパティを
GAMExampleLogin に設定します。
この場合、非公開オブジェクトにアクセスすると、
GAMExampleLogin オブジェクトが自動的に実行されます。ユーザーはローカルな GAM を使用して認証を行うことができます。または、専用のアイコンを使用して、リモート認証が可能です。
- ユーザーが ID プロバイダーに対して初めて認証を行う場合、ID プロバイダーの GAM データベースで使用されたものと同じ GAMUser GUID 識別子を使用して、ユーザーはクライアントアプリケーションの GAM データベースに登録されます。
- パスワードはクライアントの GAM データベースには格納されません。また、適用されるパスワードポリシーは、サーバーアプリケーションの GAM データベースのポリシーになります。
X Evolution 3 および以前のバージョンでは、GAMRepository.Logout() メソッドが、クライアントにローカルなログアウトを実行します。サーバーでは、サーバー上でログアウトが実行されるまで、セッションが引き続き有効になります。
GeneXus 15 以降、3 つの異なるログアウト動作を設定できます。「
GAM を使用したシングル サイン オンのログアウトオプション」を参照してください。
- ここで使用されるメカニズムは OAuth 2.0 に基づいています。
- GeneXus 15 Upgrade 2 以降の GAM では、SD アプリケーションでも SSO が実装されます。
(1)
GAM - GAMRemote 認証タイプ
(2)
SSO を使用したアプリケーションのロールの管理
(3)
実行時の GAM SSO フロー
(4)
GAM を使用しないアプリケーションに SSO を実装する方法