IdP起点SAMLサインオンをOIDCアプリに構成する

Auth0はアプリケーションのために、IDプロバイダー(IdP)起点のSAML応答をOpenID Connect(OIDC)応答に変換する方法を提供しています。

OIDプロトコルはIdP起点の認証フローに対応しませんが、この方法ではフォームPOSTを使用した暗黙フローを使ってIdP起点の認証フローを模倣することができます。

これを実装するには、以下を行う必要があります。

  • カスタムログイン経路ハンドラーをアプリケーションに追加します。

  • 以下を許可するようにSAML接続を更新します。

    1. IdP起点のSAML応答の受信を受け付ける

    2. サービスプロバイダー起点の認証要求を送信するデフォルトのアプリケーションにリダイレクトする

仕組み

OIDCアプリケーションフロー図へのIDプロバイダーが開始したSAMLサインイン
  1. ユーザーがSAML IdPのログインエンドポイントに移動します。

  2. SAML IdPがログインページを返します。

  3. ユーザーが資格情報をSAML IdPに送信します。

  4. SAML IdPがユーザーのセッションを作成し、フォームPostとSAML応答のあるHTMLページを返します。

  5. ページがHTTP POST呼び出しを行って、自動的にSAML応答をAuth0テナントに送信します。

  6. Auth0テナントがユーザーのブラウザーでOIDCアプリケーションのカスタムログイン経路ハンドラーにリダイレクトし、DトークンをURLフラグメントとして渡します。

  7. ブラウザーがOIDCアプリケーションのカスタムログイン経路ハンドラーを呼び出して、connectionパラメーターとIDトークンを渡します。

  8. OIDCアプリケーションがIDトークンを無視してconnectionパラメーターを解析し、セッションのstateパラメーターを作成してから、ユーザーのブラウザーをAuth0テナントの/authorizeエンドポイントにリダイレクトします。

  9. ブラウザーがAuth0テナントの/authorizeエンドポイントを呼び出して、提供されたconnectionstateのパラメーターを渡します。

  10. Auth0テナントがSAMLログイン要求を生成し、ユーザーのブラウザーをSAML IdPのログインエンドポイントにリダイレクトします。

  11. ブラウザーがSAMLログイン要求をSAML IdPのログインエンドポイントに送信します。

  12. SAML IdPがユーザーのセッションを見つけて、フォームPostとSAML応答のあるHTMLページを返します。

  13. ページがHTTP POST呼び出しを行って、自動的にSAML応答をAuth0テナントに送信します。

  14. Auth0テナントがユーザーのブラウザーをアプリケーションのログイン経路ハンドラーにリダイレクトします。

  15. ブラウザーばアプリケーションのログイン経路ハンドラーを呼び出して、提供されたstateパラメーターとIDトークンを渡します。

  16. OIDCアプリケーションがstateパラメーターを検証して、IDトークンを解析し、ユーザーにアプリケーションセッションを作成します。

カスタムログイン経路ハンドラーを作成する

カスタムログイン経路ハンドラーはアプリケーションのログインメソッドを呼び出します。ハンドラーはconnectionパラメーターを受け付けて、Auth0テナントに送信する認証要求に含めます。

カスタムログイン経路ハンドラーに関係付けるエンドポイントは、標準のログイン経路ハンドラーに関係付けているものとは別にすることをお勧めします。たとえば、標準のログイン経路ハンドラーを/loginエンドポイントと関連付けている場合には、カスタムログイン経路ハンドラーを/startloginエンドポイントと関連付けます。

Auth0 Single Page App SDKを使用している場合には、カスタムログイン経路ハンドラーを追加して、ログインメソッドを更新し、以下のように接続パラメーターに対応させることができます。

const router = {
  "/": () => showContent("content-home"),
  "/profile": () =>
    requireAuth(() => showContent("content-profile"), "/profile"),
  "/login": () => login(),
  "/startlogin": () => startlogin()
};

//new method to start login from idp-initiated callback
const startlogin = async () => {
  console.log(window.location.href)
  let myURL = new URL(window.location.href);
  let conn = myURL.searchParams.get("connection");
  return  login(null, conn);
}

/**
 * Starts the authentication flow
 */
const login = async (targetUrl, connection) => {
  try {
    console.log("Logging in", targetUrl);

    const options = {
      redirect_uri: window.location.origin,
    };

    if (connection) {
      options.connection = connection;
    }

    if (targetUrl) {
      options.appState = { targetUrl };
    }

    await auth0.loginWithRedirect(options);
  } catch (err) {
    console.log("Log in failed", err);
  }
};

Was this helpful?

/

クエリ文字列を作成する

クエリ文字列にはredirect_uriパラメーターを含めます。パラメーターの値はURLエンコードされ、以下で構成されなければなりません。

  1. カスタムログイン経路ハンドラーに関連付けられているアプリケーションのエンドポイント

  2. SAML接続名の値が指定されたconnectionパラメーター

アプリケーションのエンドポイントがhttps://exampleco.com/startloginでSAML接続名がmy-saml-connectionの場合、クエリ文字列はredirect_uri=https%3A%2F%2Fexampleco.com%2Fstartlogin%3Fconnection%3Dmy-saml-connectionになります。

アプリケーションを構成する

  1. [Auth0 Dashboard]>[Applications(アプリケーション)]>[Application(アプリケーション)]に移動します。

  2. Auth0にあるOIDCアプリケーションを表す新しいアプリケーションを作成します。

  3. [Allowed Callback URL(許可されているコールバックURL)]に、カスタムログイン経路ハンドラーに関連付けられているアプリケーションのエンドポイントを含めて更新します。

接続を構成する

  1. [Auth0Dashboard]>[Authentication(認証)]>[Enterprise(エンタープライズ)]>[SAML]に移動します。

  2. 新しいSAML接続を作成します。

  3. [IdP-Initiated SSO(IdP起点のSSO)]ビューに切り替えます。

  4. [Accept Requests(要求を許可する)]を選択します。

  5. [Default Application(デフォルトのアプリケーション)]に、先ほど作成したアプリケーションを選択します。

  6. [Response Protocol(応答プロトコル)][OpenID Connect]を選択します。

  7. [Query String(クエリ文字列)]に、先ほど作成したクエリ文字列を入力します。

もっと詳しく