【问题标题】:Client, Auth Server and Logout客户端、身份验证服务器和注销
【发布时间】:2016-07-25 06:42:04
【问题描述】:

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

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

到目前为止一切顺利。

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

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

这一切“似乎”都很好。

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

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

非常感谢

马丁

【问题讨论】:

  • 您应该启用扩展 WebSecurityConfigurerAdapter 的注销并创建一个注销页面,该页面将帖子发送到您的授权应用程序中的 /logout。你在用弹簧靴吗?
  • 是的,拉斐尔,我是。我会试试的,谢谢。
  • Rafael - 效果很好。非常感谢。我现在需要做的就是让 Auth 服务器在之后重定向回客户端

标签: spring oauth spring-security oauth-2.0 spring-oauth2


【解决方案1】:

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

注销页面:(resources/templates/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>

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

【讨论】:

    【解决方案2】:

    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 对此有内置机制。除了我部分实施的规范之外,还有其他规范用于注销。无论您选择哪种方式,遵循记录在案的规范都可能是个好主意。

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 2012-08-28
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多