web-dev-qa-db-ja.com

CookieベースのSSO

SsoサーバーなしでCookieベースのシングルサインオンを実装するにはどうすればよいですか?ブラウザのCookieのみを使用して、ログインしたユーザーを複数のアプリケーション間で共有したいと思います。

私の考えでは、次のように機能しています。

  • ユーザーがアプリケーションにログインする
  • アプリケーションは資格情報を確認してから、ブラウザにユーザー名を保存するCookieを設定します(秘密鍵でコーディングできます)。
  • ユーザーが別のアプリケーションを開くと、Cookieを検索し、値のユーザー名を読み取ります(文字列をデコードするためのキーを使用)

このソリューションでは、ユーザーは(別のユーザーの)ブラウザーCookieを確認し、ユーザー名を体系化した文字列を取得できます。それから彼はそれを自分のクッキーに追加することができました(ダメ!)。

これを行うための安全な方法はありますか?タイムスタンプベースのコントロールまたはこのようなもので?

前もって感謝します。

さようなら

P.S.私の英語があまり上手ではないことを知っています。ごめんなさい!

20
frengo

不可能だよ。 Cookieは各ドメインに固有であり、あるドメインが別のドメインのCookieを読み取ることはできません。

14
Stefan Kendall

Ssoサーバーを使用しない簡単な解決策がありますが、Cookieはドメイン間で共有されないことがわかっているため、1つの共通Cookieを使用しません。

ユーザーがsite-a.comで認証するとき、site-a.comドメインにCookieを設定します。次に、site-b.comで、作成されたCookieにアクセスできるサーバーサイドスクリプト(phpなど)によって生成されたsite-a.comからの動的JavaScriptをリンクし、同じCookieをsite-b.comにコピーします。 jsを使用してクライアント側で。これで、ユーザーに再ログインを要求することなく、両方のサイトに同じCookieが設定されます。

サイトaとサイトbの両方がデコード方法を知っている方法を使用してCookie値を暗号化/エンコードし、サイトbがCookieのコピーを検証できるようにすることができます。共通の共有シークレットを使用します。これがないと、エンコードまたはデコードできません。

Site-b.comの最初のページの読み込みでCookieが存在しないことがわかります。したがって、必要に応じて、Cookieを設定した後にページの再読み込みを行うことをお勧めします。

8
Benedict

答えは少し遅れると思いますが、誰かを助けることができるかもしれません。

Iframeを使用してホームページに接続された中間ドメインにCookie/localStorageを持つことができます

cross domain sso

1)ログインいずれかのドメインのログインフォームは、イベント(postMessage)によってsso.domain.comのCookieにIDトークンを預けます。2)検証domain1とdomain2には、sso.domain.comを指すiframeが含まれています。トークンとホームページに通知

開発を簡素化するために、最近、JWTとのクロスドメインSSOを https://github.com/Aralink/ssojwt でリリースしました。

4
pedrofb

私は似たようなことをしました。 PHPアプリケーションがあり、ユーザーがログインすると、システムがWebサービスに接続し、サービスがActive Directoryでユーザーの資格情報を確認します。ユーザーが認証されると、ユーザーのPHPセッションはDBに保存されます。別のWebアプリケーションはCookieからPHPセッションを読み取り、PHPアプリケーション、PHPアプリケーションはデータベース内のセッションをチェックし、ユーザーIDを返します。このようにして、SOAを使用したSSOがあります。

ブラウザに保存されているユーザーIDに依存しないでください。これはセキュリティエラーであり、少なくともIDを暗号化します。

最善の解決策は、ログインフォームとセッションストレージを同じアプリケーションに配置することです。そうすれば、このアプリケーションは他のアプリケーションにサービスを提供できます。

また、情報交換の種類にはHTTPSを使用します。

が同じドメインに属している場合にのみ、Cookieを読み取ることができます。例:

intranet.example.com crm.example.com example.com/erp

3
rtacconi

サブドメイン間でCookieにアクセスできますが、ブラウザのCookieを使用することは優れたソリューションではないと思います。シングルサインオンを実装するのに「SSOサーバー」は本当に必要ありません。両方のアプリケーションが認識するペイロードを思い付くのはかなり簡単です。 XML overHTTPSを使用してペイロードを送信するカスタムSSOソリューションを見てきました。

2
Neal Swearer

これが解決策です(うまくいけば、ここのセキュリティの達人によって徹底的に精査されるでしょう):

各ドメインにユーザーデータを同様のCookieに保存させ、ユーザーが新しいドメインで自分自身を認証せずに1つのドメインから別のドメインにジャンプする場合は、クエリ文字列に暗号化されたトークンを含む「ジャンプリンク」を提供します。新しいドメインはCookieを復号化し、ユーザーが誰であるかを把握してから、そのドメインの新しいCookieを発行します。 「ジャンプリンク」の有効期限を非常に短くしたいので、ページに直接生成するのではなく、「ジャンプリンク」ジェネレーターとリダイレクトへのリンクを生成します。

これは必要ないかもしれませんが、「ジャンプリンク」の受信ページは、暗号化されたトークンの信頼性と有効期限が切れているかどうかを確認するために、発信元ドメインにWebサービスコールバックを行うことができます。

このソリューションはman-in-the-middle攻撃の影響を受けやすいと思いますが(現在普及している他の認証メカニズムよりも影響を受けやすいかどうかはわかりません)、暗号化されたトークンにクライアントのMACアドレスとIPアドレスを組み込むことができます。セキュリティを強化します。

0
Josh Pearce