带有 Spring 会话的 Spring Security SAML

Posted

技术标签:

【中文标题】带有 Spring 会话的 Spring Security SAML【英文标题】:Spring Security SAML with Spring session 【发布时间】:2016-12-05 12:48:33 【问题描述】:

我使用 OpenAM 作为我的 IDP,我的 SP(一个 angular2 SPA)基于在以下位置共享的示例:https://github.com/vdenotaris/spring-boot-security-saml-sample

身份验证后,我的 web 应用程序应该调用一些 REST 服务,这些服务通过 http-basic 身份验证(使用 spring 安全性)进行保护,其会话通过 Spring Session 管理。

在用户通过 OpenAM IDP 进行身份验证后,我正在尝试创建基于 spring-session 的会话。我的意图是使用这些会话来与我的 http-basic-secured REST 服务对话。

在我尝试将 spring-session 与 spring-saml 集成之前,以下是我的 webapp 的 WebSecurityConfig 的“configure()”,它工作得很好。

@Override  
protected void configure(HttpSecurity http) throws Exception 
    http
    .httpBasic()
    .authenticationEntryPoint(samlEntryPoint());
    http
    .csrf()
    .disable();
    http
    .addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class)
    .addFilterAfter(samlFilter(), BasicAuthenticationFilter.class);
    http        
    .authorizeRequests()
    .antMatchers("/").permitAll()
    .antMatchers("/publicUrl").permitAll()
    .antMatchers("/app/**").permitAll()
    .antMatchers("/error").permitAll()
    .antMatchers("/saml/**").permitAll()
    .anyRequest().authenticated();  
    http
    .logout()
    .logoutSuccessUrl("/");


并且身份验证工作正常。在 IDP (OpenAM) 发出的 POST 中,我可以看到 cookie 设置正确。例如:设置 Cookie:JSESSIONID=8DD6CDBF8079E83C8F4E7976C970BB27;路径=/; HttpOnly

Response
    Headers
        Pragma:  no-cache
        Date:  Sun, 31 Jul 2016 02:12:06 GMT
        X-Content-Type-Options:  nosniff
        Server:  Apache-Coyote/1.1
        X-Frame-Options:  DENY
        Location:  http://localhost:8097/
        Cache-Control:  no-cache, no-store, max-age=0, must-revalidate
        Set-Cookie:  JSESSIONID=8DD6CDBF8079E83C8F4E7976C970BB27; Path=/; HttpOnly
        Content-Length:  0
        X-XSS-Protection:  1; mode=block
        Expires:  0
    Cookies
        JSESSIONID:  8DD6CDBF8079E83C8F4E7976C970BB27

在我尝试将 spring-session 与 spring-saml 集成之后,以下是我的 webapp 的 WebSecurityConfig 的“configure()”,这会破坏身份验证。

@Override  
protected void configure(HttpSecurity http) throws Exception 
    http
    .httpBasic()
    .authenticationEntryPoint(samlEntryPoint());
    http
    .csrf()
    .disable();
    http
    .addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class)
    .addFilterAfter(samlFilter(), BasicAuthenticationFilter.class);
    http        
    .authorizeRequests()
    .antMatchers("/").permitAll()
    .antMatchers("/publicUrl").permitAll()
    .antMatchers("/app/**").permitAll()
    .antMatchers("/error").permitAll()
    .antMatchers("/saml/**").permitAll()
    .anyRequest().authenticated();  
    http
    .logout()
    .logoutSuccessUrl("/");

    http
    .addFilterBefore(sessionRepositoryFilter(sessionRepository(), httpSessionStrategy()),
            ChannelProcessingFilter.class)
    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);


在 IDP (OpenAM) 反击的 POST 中,我没有看到设置的 cookie。

Response
    Headers
        Pragma:  no-cache
        Date:  Sun, 31 Jul 2016 02:18:44 GMT
        X-Content-Type-Options:  nosniff
        Server:  Apache-Coyote/1.1
        X-Frame-Options:  DENY
        Location:  http://localhost:8097/
        Cache-Control:  no-cache, no-store, max-age=0, must-revalidate
        x-auth-token:  666412f1-b293-49fa-bacb-0aa6fc3d2fe0
        Content-Length:  0
        X-XSS-Protection:  1; mode=block
        Expires:  0
    Cookies

SAML 响应正常,因为我可以从 IDP 身份验证后看到主题详细信息。

来自 SAML 响应的 sn-p

    <saml:Subject>
        <saml:NameID 
            Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" 
            NameQualifier="http://openam.example.com:8080/OpenAM-13.0.0">vin@example.com
        </saml:NameID>
        <saml:SubjectConfirmation 
            Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
            <saml:SubjectConfirmationData 
                InResponseTo="a1f07e22gi7db1h425hfj65i5gh0464" 
                NotOnOrAfter="2016-07-31T02:28:44Z" 
                Recipient="http://localhost:8097/saml/SSO"/>
        </saml:SubjectConfirmation>
    </saml:Subject>

由于未设置 cookie,我无法获取主体对象。我的 UI 假定用户未通过身份验证,并将用户再次重定向到 IDP,并继续循环运行。

非常感谢您的回复。

【问题讨论】:

你试过了吗? github.com/ulisesbocchio/spring-boot-security-saml 您是否尝试启用第三方 Cookie? 【参考方案1】:

尝试在属性文件中添加:server.session.tracking-modes=cookie。另外,尝试添加 SSL。该 cookie 可能被标记为安全,并且没有 SSL 是不可见的。

【讨论】:

以上是关于带有 Spring 会话的 Spring Security SAML的主要内容,如果未能解决你的问题,请参考以下文章

带有 AOP 的 Spring 会话范围 bean 中的问题

使用带有 Spring 和 Hibernate 的会话工厂处理多个数据库连接

Spring-security:带有 COOKIE 的会话配置不起作用

带有会话 Cookie 的 Spring Security RememberMe 服务

会话验证 - 带有微服务的 Spring Security

带有 Spring Security 的氛围