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

如何在向 IDP 发送身份验证请求时将当前 URL 作为中继状态发送

朱啸
2023-03-14

在为我们的一个应用程序实施基于SAML的身份验证时,我遇到了一个要求,即我们需要在通过IdP(身份提供商)身份验证后恢复用户的会话。请考虑以下场景 -

    < li >用户试图打开第1页 < li >由于第1页要求验证,我们将用户重定向到IDP < li>IDP验证并将用户重定向回SP(服务提供商)。

不幸的是,在身份验证后,用户最终会进入默认主页而不是第 1 页。根据文档,我们可以使用 relayState 将信息从 SP 中继到 IdP(在身份验证请求期间),然后再从 IdP 中继到 SP。

看起来WebSSOProfileOptions允许我们指定relayState值,但在这种情况下,该值不会是固定的或静态的。

我们如何将当前页面的URL传递到中继状态,以便在身份验证后返回相同的URL并将用户重定向回同一页面?

共有1个答案

乌鸿宝
2023-03-14

解决方法:< br > WebSSOProfileOptions类的官方链接演示了在relayState变量中发送自定义值的函数,即void setrelay state(String relay state)。< br >向IDP发送验证请求时将当前URL作为中继状态发送的编码示例

@Bean
 public SAMLEntryPoint samlEntryPoint() {
     SAMLEntryPoint entryPoint = new SAMLEntryPoint();
     entryPoint.setDefaultProfileOptions(defaultWebSSOProfileOptions());
     return entryPoint;
 }
@Bean
 public WebSSOProfileOptions defaultWebSSOProfileOptions() {
     WebSSOProfileOptions options = new WebSSOProfileOptions();
     options .setBinding("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST");
     options.setRelayState(current-SP-URL);
     return options;
 }


备注:
(1)引用您的帖子“看起来WebSSOProfileOptions允许我们指定relayState值,但在这种情况下,该值不会是固定的或静态的。

回应:< br >是。为什么SP发起的SSO具有作为随机不透明值的RelayState的答案声称SP发起的SSO中的RelayState通常不是URL。相反,它是一个不透明的字符串,得到IDP的回应。< br >这意味着“该值不会是固定的或静态的”。

(2)引用您的问题“我们如何将当前页面的URL传递到中继状态,以便我们可以在身份验证后返回相同的URL并将用户重定向回同一页面?

回答:
为什么SP发起的SSO将RelayState作为随机不透明值的答案声称,根据规范中的上述描述,RelayState只是服务提供商用于找出最终目标的指针(URL)。如果SP使用RelayState将URL发送到IDP,它会破坏安全模型。
这意味着我们不能“将当前页面的URL传递给RelayState”,否则,它将破坏SAML建立的安全模型。
这就是为什么Spring SAML要求SP启动的SSO生成的RelayState值不是固定的或静态的,即“身份验证后用户最终出现在默认主页而不是第1页。”。

(3) 其他信息
(I) 对于 SP 启动的 SSO,RelayState 值应为不透明字符串。
(II) 对于 IdP 启动的 SSO,中继状态值可以是 SP 应重定向到的 URL。这是用于 RelayState 的事实标准,正如另一个 StackOveflow 问题“SSO(例如 SAML)中使用的 RelayState 参数到底是什么?”的回答所证明的那样。
(三)您不能“在向IDP发送认证请求时将当前URL作为中继状态发送”,否则,它将破坏SAML建立的安全模型,如为什么SP启动的SSO将RelayState作为随机不透明值的答案所示。

 类似资料:
  • 问题内容: 我想从我的API请求资源时发送身份验证令牌。 我确实使用$ resource实现了服务: 我有一个存储身份验证令牌的服务: 我想通过服务发送的每个请求都发送令牌。通过将其放入特定动作的调用中,我能够发送它。例如,这有效: 但是我宁愿将access_token定义为服务中的参数,因为它必须随每个调用一起发送。并提高干度。但是工厂中的所有内容仅执行一次,因此access_token在定义工

  • 我试图用我正在使用的API进行身份验证,但是当我试图登录时,我收到了这样的响应:加载资源失败:服务器响应状态为404(未找到)[http://localhost:8080/localhost: 5000/api/登录] 我认为问题出在axios上,因为它使用我的本地Vue应用程序地址apiAdress来执行请求。 主要的js: 模块/身份验证。js: login.vue:

  • 问题内容: 我有一个应用程序,该应用程序最初作为iPhone应用程序存在,现在作为Android应用程序存在。功能之一是加载网页,该网页通过将字符串作为Referer传递来绕过安全性登录。iPhone的代码如下- 我在Android应用中使用的代码是- 但是,当我运行它时,访问被拒绝,因为我没有以“ Referer”的身份发送请求。我该如何在Android代码中做到这一点? 问题答案: 将load

  • 问题内容: 我有一个具有基本身份验证的RESTFull服务,我想从iOS + swift调用它。我必须如何以及在何处为此请求提供凭据? 我的代码(对不起,我刚刚开始学习iOS / obj-c / swift): } 问题答案: 您需要在实例中提供凭据,例如Swift 3: 或在Swift 2中:

  • 问题内容: 我一直在使用HTTPClient版本4.1.2尝试通过需要基本身份验证的HTTP API访问REST。这是客户端代码: 当我构造一个请求时,像这样: 我在Charles Proxy中 看到有两个请求正在发送。一个不带标题,另一个 带 标题。如您所料,第一个失败的原因是401,但是第二个失败的情况却是201。 有谁知道为什么会这样吗?谢谢! 编辑: 我应该明确指出,我已经看过这个问题了,

  • 我试图在PhantomJS中打开一个需要HTTP身份验证的网页。我的脚本基于loadspeed.js示例: 我可以从渲染的page.jpg中看到,我每次都得到401分。我还使用Wireshark跟踪了HTTP会话,这表明GET请求中没有向给定URL发送身份验证标头。 我到底做错了什么?我刚刚开始使用PhantomJS,但我整个晚上都在寻找,没有走远...