带有 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 的会话配置不起作用