2

だから、私はすべてSpring OAuth2を使用して、スタンドアロンのOAuth2認証サーバーとクライアントアプリ(Webベース)を持っています。

Springセットアップを使用して(ログインフォームを介して)クライアントアプリからリダイレクトなどを行うログインフォームホストがAuthサーバーにあります。

これまでのところすべて順調です。

クライアントにログアウト設定を追加しました。

.and()
  .logout()
  .addLogoutHandler(oauth2LogoutHandler())
  .logoutSuccessUrl("/")
  .clearAuthentication(true)
  .deleteCookies("JSESSIONID")
  .invalidateHttpSession(true)
  .permitAll()

それはすべて問題ないようです。

ただし、クライアントで「ログイン」リンクをクリックすると、認証アプリにリダイレクトされるときにログイン画面が表示されませんが、リダイレクトハンドシェイクが発生してクライアントアプリに戻ります。

それで、問題は、クライアントアプリでログアウトするときに認証サーバーで「クリア」する必要があるのは何ですか? どういうわけか、セッション情報は認証アプリに保持されていますが、ログインを押したときにそのセッションがどのように取得されているかわかりませんか? 「ログアウト」を認証サーバーに伝達するクリーンな方法はありますか?

どうもありがとう

マーティン

4

2 に答える 2

1

https://spring.io/blog/2015/02/03/sso-with-oauth2-angular-js-and-spring-security-part-v#the-logout-experienceは、悪名高いトリッキーについて本質的に同じ問題を説明しています問題。

ログアウト体験

「ログアウト」リンクをクリックすると、ホームページが変更され (挨拶が表示されなくなります)、ユーザーが UI サーバーで認証されなくなります。ただし、「ログイン」をクリックして戻ると、実際には認可サーバーでの認証と承認のサイクルに戻る必要はありません (ログアウトしていないため)。それが望ましいユーザー エクスペリエンスであるかどうかについては意見が分かれるでしょう。これは非常に厄介な問題です (Single Sign Out: Science Direct の記事と Shibboleth のドキュメント)。理想的なユーザー エクスペリエンスは技術的に実現可能ではない可能性があります。また、ユーザーが自分が望んでいることを本当に望んでいるのかどうかを疑う必要がある場合もあります。「'logout' でログアウトしたい」というのは単純に聞こえますが、当然の反応は次のとおりです。「何からログアウトしたの?この SSO サーバーによって制御されているすべてのシステムからログアウトしますか?それとも、[ログアウト] リンクをクリックしたシステムからのみログアウトしますか?」ここでは、このトピックについてこれ以上広く議論する余地はありませんが、もっと注目に値するものです。興味がある場合は、Open ID Connect 仕様の実装に関する原理と (かなり食欲をそそらない) アイデアについての議論があります。

これは、認可サーバーに「エンド セッション エンドポイント」を実装するために、Spring ベースの OpenID Connect (OAuth2 の拡張) プロジェクトの github に提出した PR です: https://github.com/mitreid-connect/OpenID-Connect- Java-Spring-Server/pull/972 . これは、 RP 開始 (またはクライアント開始) ログアウトのhttps://openid.net/specs/openid-connect-session-1_0.html#RPLogout仕様の一部を実装します。

Spring には、このためのメカニズムが組み込まれているとは思いません。ログアウトに関しては、一部実装した以外にも仕様があります。どちらを選択したとしても、文書化された仕様に従うことをお勧めします。

于 2016-04-05T13:02:09.573 に答える