web-dev-qa-db-ja.com

ログインしていないユーザーに対してブラウザのリダイレクトなしでクロスドメインの自動ログインSSOを実装するにはどうすればよいですか?

次の要件でSSOソリューションを実装する必要があります。

  1. クロスドメイン:a.comb.comsso.comがあるとしましょう。 a.comからログインした場合、b.comにアクセスしてもログインする必要はありません。
  2. Centralized:a.comで[ログイン]をクリックした未登録のユーザーには、sso.comでホストされているログイン画面が表示されます。資格情報は、それにのみアクセス可能なデータソースのsso.comによってチェックされます。
  3. 自動ログイン:ユーザーがa.comにログインし、その後b.comにアクセスすると、すぐにログインされます。つまり、b.comでは、「ログイン」リンクの代わりに、ユーザー名などをすぐに表示したい-何もクリックする必要がない。
  4. 匿名ユーザーのリダイレクトなし:ユーザーの大多数は、アカウントなしでサイトを使用します。したがって、彼らが最初にa.com、またはb.comにアクセスしたときに、ページ全体をsso.comにすばやくリダイレ​​クトして、ログインしているかどうかを確認する必要があります。そのようなリダイレクトSEOとレイテンシに悪影響を及ぼします。

a.comにログインしてb.com(またはその逆)にアクセスした少数のユーザーは、リダイレクトが許可されます。

特にOAuth2、OpenID Connect、CASを使用したSSOの例はWebに多数ありますが、これらの特定の要件のレシピは見つかりませんでした。最も近いのはStackoverflow SSOガイド( こちら )ですが、私にはない追加の要件があります(たとえば、SSOサーバーがダウンしてもログインは機能するはずです)。

10
Jan Żankowski

このOpenID Connectスキームはそれを行うべきだと私には思えます。 ただし、私はセキュリティの専門家ではないので、それ以上の確認なしに使用しないでください。

  1. ユーザーはa.comb.comsso.comにログインしていません。
  2. ユーザーがa.comにアクセスし、[ログイン]をクリックします。
  3. sso.comの戻りURLをパラメーターとして使用して、a.comにリダイレクトします。
  4. ユーザーは有効な資格情報を提供します。 sso.comはそれらを受け入れ、承認コードをパラメーターとしてa.comにリダイレクトします。リダイレクト応答には、sso.comのSSOセッションCookieもあります。
  5. ブラウザはリダイレクトに従い、a.comをクエリします。 a.comサーバーは認証コードをバックエンドのsso.comに送信し、アクセストークンとIDトークンを受信し、a.comにセッションCookieを設定します。ユーザーはa.comにログインしています。
  6. ユーザーはb.comにアクセスします。
  7. b.comのJavascriptは、カスタムエンドポイント(例:sso.com)へのsso.com/has-sso-sessionへのサイレントCORS AJAX呼び出し)を行います。エンドポイントは基本的にtrue/falseリクエストのSSO cookieの存在に基づきます。
  8. 応答が:の場合
    • true、JavaScriptはブラウザをsso.comにリダイレクトし、戻りURLはb.comasパラメータにあります。これにより、通常のOpenID Connect認証がトリガーされます。これは、ユーザーがSSO Cookieを持っているため、自動的に行われます。その最後に、b.comサーバーは認証コードをバックエンドのsso.comに送信し、アクセストークンとIDトークンを受信し、b.comにセッションCookieを設定します。ユーザーはb.comにログインしています。
    • false、JavaScriptはSSO check failedb.comセッションCookieを設定します。これにより、ユーザーが[ログイン]をクリックしない限り、b.comを参照するときに、それ以上のチェックが行われなくなります。
5
Jan Żankowski

リダイレクトせずにSSOを実行する最も簡単で唯一の方法は、すべてのアプリケーションがサブドメイン(a.site.comb.site.com)。サブドメインはドメインレベルのCookieを共有できるため、アプリケーションは最初のリクエストからログインCookieを受け取ることができます。

アプリケーションを複数の無関係なプライマリドメイン(a.comb.com)、ページロード時にSSOサービスにクロスドメインリクエストを送信するJavaScriptを用意して、アクセストークンの取得を続行するかどうかを決定するのが最善の方法です。スパイダーはJavaScriptを実行しないため、これはSEOに影響しません。また、ログに記録されていないユーザーによる最初のページの読み込みにより、匿名バージョンのページが表示されるため、匿名ユーザーのレイテンシは追加されません。

2
Lie Ryan