【问题标题】:CAS single logout callback hits 403(forbidden)CAS单次注销回调命中403(禁止)
【发布时间】:2014-09-09 09:30:47
【问题描述】:

我改写了问题并删除了旧问题。希望我现在能得到答案。

CAS 服务器尝试在 SLO 上向受保护的应用发送回调请求:

<Error Sending message to url endpoint [http://localhost:8080/j_spring_cas_security_check]. Error is [Server returned HTTP response code: 403 for URL: http://localhost:8080/j_spring_cas_security_check]>

在调试时,org.jasig.cas.client.session.SingleSignOutFilter 永远不会被命中。

@Override
    public void configure(HttpSecurity http) throws Exception {
        http.
                addFilter(casFilter()).
                addFilterBefore(requestSingleLogoutFilter(), LogoutFilter.class).
                addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class)
                .logout().permitAll().logoutSuccessUrl("http://localhost:8080/j_spring_cas_security_logout").invalidateHttpSession(true).and()
                .authorizeRequests().antMatchers("/home2").hasAuthority("USER").and()
                .exceptionHandling()
                .authenticationEntryPoint(casEntryPoint)
                .and()
                .httpBasic();
    }


Filter casFilter() {
    CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter();
    casAuthenticationFilter.setServiceProperties(getServiceProperties());
    casAuthenticationFilter.setAuthenticationManager(getProviderManager());
    return casAuthenticationFilter;

}

LogoutFilter requestSingleLogoutFilter() {
    LogoutFilter logoutFilter = new LogoutFilter("http://localhost:8089/cas/logout",
            new SecurityContextLogoutHandler());
    logoutFilter.setFilterProcessesUrl("/j_spring_cas_security_logout");
    return logoutFilter;
}


SingleSignOutFilter singleSignOutFilter() {
    SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
    return singleSignOutFilter;
}

 @Override
public void onStartup(ServletContext servletContext) throws ServletException {
    servletContext.addListener(new   org.jasig.cas.client.session.SingleSignOutHttpSessionListener());
}

除了注销之外,我什么都有。目前它通过 LogoutFilter 使会话无效,销毁票证(重定向到 CAS)但是如果 SLO 请求将从其他受保护的应用程序发送,显然它不会对此应用程序产生任何影响(因为 sessionid 仍然会在这里)。

有什么建议吗?

【问题讨论】:

    标签: java spring cas


    【解决方案1】:

    在我的 spring 安全日志中我发现与 CAS SLO 有相同的情况(403 状态码):

    Invalid CSRF token found for http://localhost:8080/j_spring_cas_security_check
    

    所以我在我的安全配置中禁用了 csrf 过滤器:

    http.csrf().disable();
    

    这可能不是一个好习惯,只是一个适合我的快速解决方案。另外,如果在其他受保护的应用程序中启动 SLO,我是否能获得正确的 csrf 令牌,我也不确定。

    【讨论】:

    • 我们在 Spring 过滤器链日志的噩梦中自己解决了这个问题。懒得添加答案。谢谢,希望它能节省时间。
    • 如果您找到了比禁用 csrf 更好的解决方案,您能分享一下吗?
    • 我们只是坚持您提供的解决方案,您可以通过将其应用于注销端点地址来优化 csrf 的禁用(默认为:/j_spring_cas_security_logout)docs.spring.io/spring-security/site/docs/current/apidocs/org/…setR​​equireCsrfProtectionMatcher接受蚂蚁匹配器的方法。或者完全覆盖它以设置额外的标准(隐藏并且不暴露给客户端代码中的潜在攻击者)请求应该满足以便不被过滤器处理。
    • 最后,即使攻击者会破坏它,因为您只会将它应用于注销 url,我真的看不出他们能做什么。恶意注销用户? :-)
    • 我同意,没有多少人会对恶意注销用户感兴趣 :) 不过感谢您的重播,也许我会找到一些时间来弄清楚如何仅为 cas 服务器禁用 csrf,但禁用它用于注销 url 似乎很好。
    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2013-08-18
    • 2011-05-31
    相关资源
    最近更新 更多