Liferay DXPを複数のIdPで構成する方法(SAMLとOIDCによるOKTA)。

この記事は、Liferay DXP 7.x を2つのSSOプロトコル(SAML 2.0 を使用する Okta と Google OpenID Connect)で動作するサービスプロバイダとして設定する方法について説明しています。 基本的な設定はLiferay内ですぐに実現できますが、完全に機能させるためには追加のカスタムコードが必要です。 今回は、その両方の側面から解説します。

基本設定

Okta - SAML 2.0を使用したLiferayの統合

アイデンティティ・プロバイダーとしてOkta、サービス・プロバイダーとしてLiferay DXPを提供します。

ステップ1 - Oktaアカウント作成

  1. このリンクをクリックして、Oktaのテストアカウントを作成します https://developer.okta.com/signup/. Oktaのウェブサイトに移動します。
  2. 必要事項を入力すると、入力されたメールアドレスにOkta開発者アカウント有効化のお知らせが届きます。 Activate your account をクリックすると、アカウントが有効になり、Okta developer consoleにナビゲートされます。

ステップ2 - Oktaでのアプリケーションの作成

  1. 左メニューの「 アプリケーション」をクリック -> アプリケーション > アプリ統合の作成 > SAML 2.0の確認 (SAMLを利用して統合するので)
  2. Edit SAML integration が出てくる。 一般設定で、アプリ名を入力し、アプリケーションに表示する場合はロゴをアップロードし、ユースケースに基づいてアプリの可視性を確認し、 次へをクリックします。
  3. これにより、「Configure SAML」ページに移動します。 以下は、設定する必要がある重要な項目です。
    画像_1.png

  4. Show Advanced Settings をクリックし、ニーズに合わせて設定を選択します。
    image_2.png

  5. 属性の設定 は、ユーザー同期が必要になるまで必要ありません。 その場合、IdPからSPにユーザーをインポートするために、Liferayが必要とする属性を設定する必要があります。
    画像_3.png

  6. 残りの設定はそのままにして、 次へをクリックします。
  7. フィードバックで、オプションの2番目のチェックボックス お客様またはパートナー様ですか を選択し、 完了をクリックします。
  8. Finishをクリックすると、IdPs側(Okta)のService Provider(Liferay)設定が正常に完了します。 あとは、IdPのEntity IDとMetadataを取得して、SP側で設定する必要があります。 同じものを得るには、 Application に移動し、作成したアプリケーション(Liferay)をクリックし、Sign-On オプションに移動してください。
  9. View Setup instructions をクリックすると、メタデータがダウンロードされ、Entity ID が表示されます。
  10. Identity Provider Issuer は Entity ID で、Liferay Identity Provider の接続にアップロードするために、メタデータをコピーして metadata.xml として保存してください。 これでアプリケーションの作成は完了です。

ステップ3 - Oktaでのユーザー作成

  1. ディレクトリ > 人物 > をクリックし、 人物の追加をクリックします。
  2. 詳細を入力すると、それぞれのメールアドレスにアカウント作成のためのアクティベーションが通知されます。
  3. Activate Okta Account をクリックすると、アカウントが作成されます。 アカウントの作成に成功したら、Okta内に作成したアプリケーション(Liferay)にそれぞれのユーザーを割り当てる必要があります。
  4. 同じことを行うには、それぞれのユーザーをクリックし、 Assign Application をクリックすると、ユーザーをそれぞれのアプリケーションに割り当てることができます。

ステップ4 - Liferayの設定

  1. Liferay DXP 7.3 バンドル(バニラ)を起動します。
  2. Control Panel > Security > SAML Admin > General にアクセスし、 SAML RoleService Providerに、 Entity IDliferayspに設定する。
  3. 証明書を作成します。
  4. Service Provider タブでは、デフォルトの設定のままにしておきます。
  5. Identity Provider Connection タブで、以下を設定します。(Oktaのメタデータファイルを忘れずにアップロードしてください。)
    画像_4.png

  6. General タブに戻り、Service Providerを有効にします。
  7. ホームページにサインインポートレットを追加する(SSOが機能しない場合、管理者はSSOをバイパスしてポータルにサインインすることができます)。
  8. 新しいブラウザを開き、右上の「 Sign-In 」をクリックすると、Oktaのサインインページにリダイレクトされます。
  9. ユーザー名とパスワードを入力します。
  10. ユーザーはLiferayのホームページに戻り、自動的にサインインします。

Google OpenID Connect

ステップ1 - Liferay DXPをOAuth 2.0クライアントとしてGoogle APIに登録する

  1. https://console.developers.google.com
  2. プロジェクトが存在しない場合は、プロジェクトを作成します。
  3. https://developers.google.com/identity/protocols/oauth2/web-server#creatingcredのドキュメントを参照してください。 以下に例を示します。
    1. Create credentials > OAuth client IDをクリックします。
    2. 指定する 認可されたリダイレクト URI あなたのアプリケーションのために https://www.sp.com:8443/c/portal/login/openidconnect
    3. Googleプラットフォームが生成したOAuth認証情報(client_idとclient_secret)を取得します。

ステップ2 - Liferayの設定

  1. OpenID Connectプロバイダー接続の構成:
    1. コントロールパネル > 設定 > システム設定 > セキュリティ > SSO にアクセスし、システムスコープで OpenID Connect Provider を選択し、以下の手順を実行します。
      1. 追加ボタンをクリックしてプロバイダーを追加します。
      2. プロバイダーから受け取った情報を使って、フォームに記入してください。
        • プロバイダー名。この名前は、ユーザーがOpenID Connectを使用してログインするときに、サインインポートレットに表示されます。
        • OpenIDクライアントID。プロバイダから受け取ったOAuth 2.0クライアントIDを記入します。
        • OpenID Connect Client Secret: プロバイダから受け取ったOAuth 2.0クライアントシークレットを入力します。
        • ディスカバリーエンドポイント。残りのURLはこのエンドポイントを通じて取得される。 OpenID Connect Providerから発信されています。 例:
          https://accounts.google.com/.well-known/openid-configuration
  2. DXPでのOpenID Connect認証の有効化
    1. コントロールパネル > 設定 > システム設定 > セキュリティ > SSO にアクセスし、 OpenID Connect 仮想インスタンススコープを選択します。
    2. Enabled チェックボックスをクリックし、 Saveをクリックします。

      : コントロールパネル → 設定 → インスタンス設定 → OpenID Connect タブで、指定した仮想インスタンスの OpenID Connect 認証を有効にすることも可能です。

  3. お客様のポータルサイト(例:https://www.sp.com:8443)にアクセスします。
  4. ホームページのサインインポートレットで、 OpenID Connect のリンクをクリックします。
  5. デフォルトのGoogle OIDCがリストに入っています
  6. サインインボタンをクリックすると、Googleのサインインページが表示されます。
  7. 通常通り、認証情報を入力します
  8. ログインに成功すると、トップページに戻るはずです。

推奨されるカスタムコード

課題

  1. ゲストとしてプライベートページをリクエストすると、常にSAMLログインとなる
  2. 以前OIDCで認証されたユーザー(例えば期限切れのセッションなど)は、SAMLログインを経由します。
  3. より一般的には、/c/portal/login へのリクエストはすべて SAML を介して行われる。
  4. SAMLが有効な場合のログインポートレットのレンダリングには、いくつかの修正が必要です。

ソリューション

com.liferay.saml.runtime.servlet.profile.SamlSpIdpConnectionsProfile#isEnabled を @Component で実装します。 LoginAction (/c/portal/login) が呼ばれるたびに呼び出され、HttpServletRequestオブジェクトとともに提供されます。 これは、構成された SAML IDP 接続 (これも提供される) ごとに 1 回呼び出される。 すべての呼び出しが false を返した場合、通常のログインポータルがレンダリングされる。 SAML Adminの「Service Provider」タブでこれを有効にしている限りは。

SAMLかSAMLでないかの判断が、スタッフかスタッフでないかに基づいている場合は、これで十分かもしれない。 なぜなら、スタッフのリクエストは、既知のサブネットから来る可能性が高いからです。 あるいは、フロント・ウェブサーバーがHTTPリクエストに何らかのタグを付けることができるかもしれません(例えば、ヘッダーなど)。

ユーザごとの制御が必要な場合は、ログインポートレットで SAML ログインができるようにするのもよい方法です。 そのために com.liferay.saml.runtime.servlet.profile.SamlSpIdpConnectionsProfile#isEnabled 特別な "useSAML" (任意の名前の)HTTPリクエストパラメータが存在しないときは常にfalseを返すようにすることができました。

これにより、ログインポートレットは常にレンダリングされるようになり、OpenId Connectが行う方法と同様に、DynamicIncludeを登録して「SAML」リンクを追加することができる。 このリンクは、/c/portal/login?useSAMLにする必要があります。 クリックすると、SAML IdP へのリダイレクトが発生するか、複数の SAML IdP が利用可能な場合は、ユーザに SAML IdP の選択が提示される。

ログアウトも問題なく動作する。これは、SAML IdP からログアウトを要求する前に、アクティブな SAML SP セッションがあるかどうかを確認するためである。

この記事は役に立ちましたか?
5人中4人がこの記事が役に立ったと言っています