【问题标题】:JASIG CAS: single sign out not workingJASIG CAS:单点注销不起作用
【发布时间】:2011-09-01 19:16:36
【问题描述】:

我的单点登录运行良好,但单点注销无法正常工作。

场景是这样的:

  1. 打开 webapp1 并重定向到 CAS 登录页面
  2. 输入详细信息并登录
  3. 打开同样使用 CAS 的 webapp2。自动登录,因为用户已经登录。
  4. 退出 webapp1
  5. 尝试打开 webapp1 或 webapp2(在另一个选项卡中)会将您重定向回登录页面。
  6. 但是,在步骤 3 中与 webapp2 的会话并未关闭,用户仍然可以毫无问题地使用该应用程序。如何在用户退出时自动使会话失效?

两个应用程序的注销按钮首先调用session.invalidate(),然后重定向到https://localhost:8443/cas/logout

单点注销过滤器是 web.xml 文件中的第一个过滤器。我在 web.xml 中也有 SingleSignOutHttpSessionListener

以下是我的 web.xml 的摘录

<!-- CAS settings -->
<!-- Use filter init-param if your container does not support context params. 
    CAS Authentication Filter and CAS Validation Filter need a serverName init-param 
    in lieu of a context-param definition. -->
<context-param>
    <param-name>serverName</param-name>
    <param-value>https://localhost:8443</param-value>
</context-param>

  <!-- Facilitates CAS single sign-out -->
  <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
  </listener>

  <!--
  CAS client filters
  Single sign-out filter MUST come first since it needs to be evaluated
  before other filters.
  -->
  <filter>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
  </filter>

  <filter>
        <filter-name>CAS Authentication Filter</filter-name>
        <!--
        IMPORTANT:
        Use Saml11AuthenticationFilter for version 3.1.12 and later.
        Use org.jasig.cas.client.authentication.AuthenticationFilter for previous
        versions.
        -->
        <filter-class>
              org.jasig.cas.client.authentication.Saml11AuthenticationFilter</filter-class>
        <init-param>
              <param-name>casServerLoginUrl</param-name>
              <param-value>https://localhost:8443/cas/login</param-value>
        </init-param>
        <init-param>
        <param-name>service</param-name>
        <param-value>https://localhost:8443/JAdaptiv/default.action</param-value>
    </init-param>
  </filter>

  <filter>
        <filter-name>CAS Validation Filter</filter-name>
        <filter-class>
              org.jasig.cas.client.validation.Saml11TicketValidationFilter</filter-class>
        <init-param>
              <param-name>casServerUrlPrefix</param-name>
              <param-value>https://localhost:8443/cas</param-value>
        </init-param>
        <init-param>
              <param-name>redirectAfterValidation</param-name>
              <param-value>true</param-value>
        </init-param>
        <init-param>
              <!-- Leniency of time checking in ms when validating SAML assertions. Consider 
                    setting this parameter more liberally if you anticipate system clock drift 
                    on your application servers relative to the CAS server. The default is 1000 
                    (1s) and at least one person had problems with drift at that small a tolerance 
                    value. A good approach is to start low and then increase by 1000 as needed 
                    until problems stop. Note that increasing this value may have negative security 
                    implications. Consider fixing clock drift problems as an alternative. -->
              <param-name>tolerance</param-name>
              <param-value>1000</param-value>
        </init-param>
  </filter>

  <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>
              org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
  </filter>

  <filter>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
  </filter>

  <filter-mapping>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
  </filter-mapping>

  <filter-mapping>
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/*</url-pattern>
  </filter-mapping>

  <filter-mapping>
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
  </filter-mapping>

  <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>CAS Assertion Thread Local Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

【问题讨论】:

  • 我有这个确切的问题,你找到解决方案了吗?
  • 我有这个确切的问题,你找到解决方案了吗?
  • @Croydon Dias,您使用有状态还是无状态的 Spring Java 应用程序?

标签: spring jsp jakarta-ee single-sign-on cas


【解决方案1】:

我还遇到了标准 CAS 协议的另一个问题,其中单点注销在集成服务器上工作,但不是从 localhost。

场景

  • 同时登录http://my-app-dev/apphttp://localhost:8080/app 并在http://my-cas/cas 上使用CAS
  • 退出 CAS http://my-cas/cas/logout
  • http://my-app-dev/app 现在将我弹回 CAS
  • http://localhost:8080 - 仍然登录!

我怀疑原因是 CAS 服务器无法向 localhost:8080 发送注销消息,因为 localhost 已在 CAS 服务器的上下文中解析,因此它实际上并没有说话到我的本地开发环境。

【讨论】:

    【解决方案2】:

    如果您使用的是 SAML 1.1 协议,请确保包含 artifactParameterName 参数

    https://wiki.jasig.org/display/CASC/Configuring+Single+Sign+Out

    <filter>
       <filter-name>CAS Single Sign Out Filter</filter-name>
       <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
       <init-param>
          <param-name>artifactParameterName</param-name>
          <param-value>SAMLart</param-value>
       </init-param>
    </filter>
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。我们有一个 java 和一个 php 客户端。当我去http://mycasserver/logout时,只有java客户端退出。

      要在 php 客户端中进行单点注销,您必须进行更改:

      phpCAS::handleLogoutRequests();
      

      phpCAS::handleLogoutRequests(false);
      

      还有,瞧! 请参阅phpCAS examples的文档

      【讨论】:

        【解决方案4】:

        在切换到 spring 配置之前,我的应用程序的配置基本相同。我查看了 SVN,基本上与您的配置的唯一区别是使用了 Single Sign Out Listener

        listener>
            <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
        </listener>
        

        这对你有用吗?当然,如果可以,请不要忘记将它添加到两个 WebApp 上。

        更新: 我在docs 中找到了监听器的描述,它应该可以完成您的设置中缺少的内容

        【讨论】:

        • 但我的 spring 配置中确实有 SingleSignOutHttpSessionListener。
        • 我已将单点注销侦听器添加到两个 web 应用程序中。我下载了 cas-client-core 的源代码并添加了一些调试语句。似乎当您注销 webapp1 时,只调用 webapp1 的 SingleSignOutHttpSessionListener,而不是 webapp2。
        • 在此期间您找到解决方案了吗?
        • 自从我问了这个问题后,我换了工作。但是,我们仍然没有找到合适的解决方案。
        【解决方案5】:

        您应该验证 CAS 服务器是否可以向您的 Web 应用发送 HTTP 请求。查看 CAS 服务器的日志。

        【讨论】:

          猜你喜欢
          • 2015-03-19
          • 2013-07-24
          • 2015-05-03
          • 2020-07-08
          • 2011-07-16
          • 2014-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多