当前位置: 首页 > 知识库问答 >
问题:

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

蔡修远
2023-03-14

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

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

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

共有1个答案

吴欣悦
2023-03-14

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

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

当然,您可以按照预期使用中继状态来实现此功能。设置中继状态的正确方法是扩展SamlentPoint,重写方法getProfileOptions并在返回的WebsProfileOptions对象中返回所需的中继状态。

然后,您可以将< code > AuthenticationSuccessHandler 更改为< code > org . spring framework . security . SAML . samlrelaystatesuccesshandler ,这将使身份验证成功后重定向到中继状态返回的URL。

 类似资料:
  • 我正在尝试向现有Okta设置添加新服务。该服务依赖SAML进行身份验证,并对SAML消息进行严格检查。 当Okta会话状态已经存在于浏览器中时,一切正常。Okta SAML响应包含所有必要的属性,以得到验证,一切只是工作。 但是,当使用“干净”浏览器启动新会话时,我的服务无法正确验证Okta SAML响应。响应有效且签名正确,但缺少严格验证所需的属性。 我想知道以前是否有人遇到过这样的问题?Okt

  • 我试图在spring security开始处理或到达spring security拦截器之前拦截登录请求。我想这样做是因为我必须对用户的输入进行一些验证。因此,我从HandlerInterceptorAdapter类创建了一个拦截器,但它不起作用。 所以我想做的是: 当任何用户尝试使用用户名和密码登录时,该请求必须首先到达LoginRequestInterceptor。对用户输入进行一些验证,如果

  • 应用程序应异步(在单独的线程中)记录以下信息,而不会影响客户端。 请求HTTP方法和URI 如果我们在过滤器中使用,那么spring将无法再次使用它进行json到对象的映射。在输入流到对象映射期间的某个地方,我们可以插入记录器吗? 更新: 我们可以在MessageConverter中编写日志代码,但这似乎不是一个好主意。

  • 我开发了一个自定义Web应用程序(WAR),它需要从请求对象中检索SAML响应并从中提取用户配置文件属性。在WebSphere(服务提供商)上部署相同的 尝试实现以下方法,其中:: -OneLogin(身份提供者)发送SAML响应和中继状态-SAML响应由ACS应用程序处理-ACS应用程序将用户重定向到自定义Web应用程序(设置在IdP的RelayState中)-然后,该应用程序将从请求中检索SA

  • 尽管我们在SAML身份验证请求中发送了签名值,但平联邦服务器会在SP启动的SSO上响应错误签名要求。以下是我要发送给平联邦的请求: 为了更好的可读性,我缩短了签名值和证书。PingFederate用SAML响应拒绝了此请求 以下是PingFederate的日志: 需要帮助我们如何解决这个问题,任何可以在Ping Federate上设置的旋钮/标志,以使其正常工作。

  • 在Vertx WebClient中记录传出http请求和响应的最简单方法是什么。我正在寻找类似于httpserver LoggerHandler的东西,但接下来是webclient的输出请求。