2

所以,我有一个独立的 OAuth2 身份验证服务器和客户端应用程序(基于 Web),都使用 Spring OAuth2。

我在 Auth 服务器上有一个登录表单主机,使用 Spring 设置(通过登录表单)从客户端应用程序重定向等。

到目前为止一切都很好。

我在客户端上添加了一个注销设置:

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

这一切“似乎”都很好。

但是,如果我然后点击我的客户端上的“登录”链接,当它重定向到授权应用程序时,我没有得到登录屏幕,而只是发生了重定向握手,我又回到了客户端应用程序中。

所以,问题是,当我在客户端应用程序上注销时,需要在 Auth 服务器中“清除”什么?会话信息以某种方式保留在身份验证应用程序上,但是当我点击登录时,我无法找到该会话是如何被拾取的?是否有一种干净的方法可以将“注销”传播到 Auth 服务器?

非常感谢

马丁

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 服务器进行身份验证。但是,单击“登录”,您实际上不需要返回授权服务器中的身份验证和批准周期(因为您还没有退出)。对于这是否是一种理想的用户体验,人们将意见分歧,这是一个出了名的棘手问题(单点退出:Science Direct 文章和 Shibboleth 文档)。理想的用户体验在技术上可能不可行,而且有时您还必须怀疑用户是否真的想要他们所说的那样。“我想要‘注销’让我退出”听起来很简单,但显而易见的反应是,“退出什么?您想退出由该 SSO 服务器控制的所有系统,还是只退出您单击“注销”链接进入的系统?” 我们没有空间在这里更广泛地讨论这个话题,但它确实值得更多关注。如果您有兴趣,那么这里有一些关于 Open ID Connect 规范中实现的原则和一些(相当令人不快的)想法的讨论。

这是我在 github 上为基于 Spring 的 OpenID Connect(OAuth2 的扩展)项目提交的 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 回答
0

您应该启用扩展 WebSecurityConfigurerAdapter 的注销并创建一个注销页面,该页面将帖子发送到授权应用程序中的 /logout

注销页面:(资源/模板/logout.ftl)

<html>
<head>
  <title>Logout Page</title>
</head>
<body>
    <form role="form" action="logout" method="post">
        Logout
          <input type="hidden" id="csrf_token" name="${_csrf.parameterName}" value="${_csrf.token}"/>
          <input type="hidden" id="redirect" name="redirect" value="${RequestParameters['redirect']!'/login'}"/>
          <button type="submit">Logout</button>
    </form>
</html>

隐藏的重定向输入将在注销后重定向到客户端应用程序

于 2016-04-05T12:47:31.680 回答