Spring saml - 在SP上启动登录时如何记住请求参数,并在IdP响应后处理它们

Posted

技术标签:

【中文标题】Spring saml - 在SP上启动登录时如何记住请求参数,并在IdP响应后处理它们【英文标题】:Spring saml - how remember request parameter when initiate login on SP, and procesing them after IdP response 【发布时间】:2014-11-18 16:47:50 【问题描述】:

我想记住我网站 (SP) 的第一个请求中的 url 请求参数,并在 IdP 响应后使用它们。

我正在使用 spring-saml 扩展并考虑 relayState 属性,但找不到如何使用请求中的参数构建它的示例。

我需要在 sso 身份验证过程后将用户重定向到目标页面(应用程序模块)取决于第一个请求中的内容。

【问题讨论】:

【参考方案1】:

Spring SAML 示例应用程序开箱即用。当用户点击受 Spring Security 保护并需要身份验证系统的页面时:

通过将信息存储到 HTTP 会话中,记住用于调用页面的参数(使用 ExceptionTranslationFilterHttpSessionRequestCache 在 Spring Security 中自动完成) 调用 Spring SAML 的入口点(SAMLEntryPoint 类)将用户重定向到 IDP,可能在 IDP 选择之后 用户在 IDP 进行身份验证并被重定向回您的应用程序 Spring SAML 验证响应并调用 AuthenticationSuccessHandler,它(在示例应用程序中)的类型为 org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler 成功处理程序检查是否有存储的请求(在第一步中放置),如果有,它会让用户的浏览器使用与最初相同的参数集打开记住的页面 安全检查现在应该通过了,前提是经过身份验证的用户有权访问该页面

您当然可以按照您的意图使用中继状态来实现这一点。设置中继状态的正确方法是扩展SAMLEntryPoint,覆盖方法getProfileOptions,并在返回的WebSSOProfileOptions 对象中返回您想要的中继状态。

然后您可以将AuthenticationSuccessHandler 更改为org.springframework.security.saml.SAMLRelayStateSuccessHandler,这将重定向到身份验证成功后从中继状态返回的URL。

【讨论】:

太棒了!我需要这句话:“设置中继状态的正确方法是扩展 SAMLEntryPoint,覆盖方法 getProfileOptions 并在返回的 WebSSOProfileOptions 对象中返回所需的中继状态。”非常感谢。 relayState 是在身份验证服务器和客户端之间传递上下文的好方法。感谢您的提示! 有没有办法同时支持两者?我希望 SP 启动的 SavedRequestAware... 行为,但 IdP 启动的 SAMLRelayState.... 回应我自己的评论:SAMLRelayStateSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler。对于 SP 发起的,不提供 RelayState,它默认重定向到受保护页面的原始请求。对于 IdP 发起,用户被重定向到 RelayState 中的目标深层链接。 意识到这是一个非常古老的问题:如果使用多租户(即别名),您将如何配置请求参数的处理?当以默认方式执行此操作时,您只需转到受 Spring Security 保护的任何 URL,SAML 包将存储原始 URL,转到 disco 并执行其余的 SSO 流程。但是,当使用别名时,我假设您只是转到 /saml/login/alias/otherLogin。这行得通,但它似乎绕过了请求的存储。即,执行 /saml/login/alias/otherLogin/?foo=bar 不会导致成功登录后转到 ?foo=bar。有什么建议吗?

以上是关于Spring saml - 在SP上启动登录时如何记住请求参数,并在IdP响应后处理它们的主要内容,如果未能解决你的问题,请参考以下文章

配置 saml-sample (SP) 以使用 Okta (IdP)

Spring SAML - 如何在 SP HTTP 请求上添加自定义字段?

如何使用 SP 密钥库 spring saml 中的证书

如何在运行时在 spring-SAML 中添加新的 idp 元数据

使用 spring-SAML 在 Pentaho 中多租户 SSO 登录后重定向

生成 SP 元数据时出现意外的堆栈跟踪表单 Spring-Security-SAML?