【问题标题】:How should I be implementing the HTTP POST Protocol Binding for SAML WebSSO Profile?我应该如何为 SAML WebSSO 配置文件实施 HTTP POST 协议绑定?
【发布时间】:2011-06-20 12:43:07
【问题描述】:

我已经使用 HTTP POST 协议绑定按照 Web SSO 的 SAML 配置文件实现了我的服务提供者和识别提供者。但是,如果来自服务提供者的 HTTP POST 未绑定到身份提供者上的会话,那么身份提供者将如何提供 <AuthnStatement> 我有点困惑。

有人能告诉我如何做到这一点吗?

我可以使用的另一种方法是 HTTP 重定向绑定,但这需要 User-Agent 干预(即浏览器),通常使用 User-Agent 作为传递中介来促进请求-响应消息交换.出于这个原因,我宁愿使用 HTTP POST,因为消息交换发生在服务器端,所以用户在他们的屏幕上看不到任何事情发生。

但是,就如何将会话绑定到请求而言,使用 HTTP 重定向对我来说更有意义。由于 HTTP 重定向是通过 User-Agent 促进的,因此对 IdP 的请求将具有会话(如果之前已通过身份验证)。 我不明白如何在 HTTP 重定向上发送 <AuthnRequest> 由 JST 回答

所以我有点困惑,很想听听其他人在做什么。这是我的问题:

  1. 使用带有IsPassive 选项和<AuthnRequest> 的HTTP POST 协议绑定,如何将服务提供者发出的请求绑定到身份提供者上的会话?换句话说,如果 POST 来自技术上是匿名会话的服务提供者,身份提供者如何知道是谁发出请求?
  2. 使用 HTTP 重定向协议绑定,如果我使用 HTTP 重定向,如何向身份提供者发送 <AuthnRequest> 由 JST 回答

更新

如果我在上面的解释中不清楚,请原谅我的困惑。我正在实现 IdP 和 SP(通过插件)。 IdP 是我希望 SP(第三方系统)用于身份验证(即 Web SSO)的现有应用程序。我目前正在开发一个简单的 PoC。 SP 实际上是一个第三方 Spring 应用程序,我正在为其开发一个插件来执行 SAML 操作。

我应该提到我正在尝试使用IsPassive 选项来执行此操作,这意味着用户代理在消息交换期间不会发挥作用。它只是启动 SAML 派对的催化剂。正确的?考虑到这一点,假设用户在第 1 步是匿名的,SP 向 IdP 发送什么以允许 IdP 确定用户是否已通过身份验证?由于 IsPassive,HTTP POST 不会通过 User-Agent 发送


更新

问题 1 已修订:当 AuthnRequset 发送并启用 IsPassive 选项时,IdP 如何解析 Principal?

直接来自 SAML 2.0 Profiles 文档,第 15 页,第 417 到 419 行:

在第 4 步中,确定主体 通过身份通过某种方式提供 超出此配置文件的范围。

我真正想要的是解释如何实现some means

【问题讨论】:

  • Ian 和 JST,感谢您的帮助,我得到了它的帮助。现在的问题是:我应该把 CHECKMARK 给谁?!我将再次审查您的两个答案,希望我能得出一个公平的结论。与此同时,我对你们两人迄今为止发布的每一个答案和评论都投了赞成票。

标签: redirect http-post saml post-redirect-get


【解决方案1】:

约翰,

在您决定编写自己的 SAML IDP/SP 实现之前,我可能会建议您退后一步并进行更多研究。您似乎将绑定与配置文件、未经请求的与请求的 Web SSO 以及 SAML 要求用户代理(又名浏览器)是 IDP 和 SP 之间几乎所有消息的承载者这一事实混合在一起。规范中还有大量信息必须实施以确保您的解决方案实际上是安全

我建议从我们的SAML Knowledge Base 开始,然后转到OASIS SAML 2.0 Technical Overview 以获取有关这些流程的信息。

或者,如果您决定采用同类最佳产品,您可以查看我们的 PingFederate 产品,该产品可以在一天内为您启用所有 SAML IDP/SP 用例。

希望这会有所帮助 - 伊恩

【讨论】:

  • 谢谢伊恩。我非常感谢额外的学习资源。我一直在阅读 OASIS 提供的规范文档,但正如我所说,它让我有些困惑。我会看看你提供的信息。希望它能给我一些清晰度。再次感谢!
  • 刚刚在这里观看了教程视频:pingfederate.com/knowledge-center/…。那么当用户点击链接访问某个 SP 资源时,该请求实际上是先通过 IdP 处理,然后再重定向到该资源?
  • 对于未经请求的响应(又名 IDP-Init SSO),是的。对于 SP-Init(您正在尝试的),SP 必须 为 IDP 生成一个 AuthnRequest 以采取行动。我将在上面评论您的 IsPassive 和身份验证问题。
【解决方案2】:

与 Ian 不同,我与生产 SAML 相关产品的公司无关。但是,我会给出一些类似的建议:退后一步,确定您实施 SP 或 IdP 的原因。你真的既是 SP 又是 IdP,还是你真的只是其中之一?如果您仅实施/充当 IdP,那么 PingFederate 或类似产品之类的产品很可能通过配置提供您所需的一切,而不是要求您编写自定义代码。如果您正在实施SP,那么这样的产品可能会帮助您,但这在很大程度上取决于您将其集成到的系统的特性。我作为一名开发人员发言,他同时完成了 IdP 和 SP 实施,并在确定由于我们的特定系统、客户和要求而确定自定义实施是我们的最佳选择之前评估了几个工具。它已经存在一年多了,有几个客户在使用它(包括一些使用不同的商业 IdP 工具)。

如果您可以根据 SAML 配置文件/绑定来识别您的用例,那么您将能够更好地做出购买与构建的决定。

【讨论】:

  • 感谢您的帮助。如果我在上面的解释中不清楚,很抱歉造成混淆。为了清楚起见,我将对其进行修改。我正在实现 IdP 和 SP(通过插件)。 IdP 是我希望 SP(第三方系统)用于身份验证(即 Web SSO)的现有应用程序。我目前正在开发一个简单的 PoC。 SP 实际上是一个第三方 Spring 应用程序,我正在为其开发一个插件来执行 SAML 操作。
  • 好的,这很有帮助。 (您使用 Java 也是如此。)我将单独回答您的具体问题。
【解决方案3】:

要记住的是,IdP 上的会话与 SP 上的会话之间没有任何联系。它们彼此不了解,仅通过 SAML 消息进行通信。 SP 发起的 SAML SSO 的一般步骤是:

  1. 匿名用户访问 SP 的资源(页面)。
  2. SP 确定用户需要在 IdP 进行身份验证。
  3. SP 构造 AuthnRequest 并发送给 IdP。
  4. IdP 执行某种身份验证,构建 SAML 响应并发送到 SP。
  5. SP 验证响应,如果有效,则执行任何必要的操作来识别 SP 的用户并让他们访问最初请求的资源。

是的,确实需要某种方式将 SP 的 AuthnRequest 连接到 IdP 的响应。 SAML 规范涵盖了这一点:SP 的 AuthnRequest 包含一个 ID 值,并且来自 IdP 的相应响应必须包含一个带有该 ID 值的 InResponseTo 属性(在其 SubjectConfirmationData 元素上)。身份验证请求协议还允许 SP 将 RelayState 参数传递给 IdP,然后要求 IdP 将其与 SAML 响应一起原封不动地传递。您(在 SP 角色中)可以使用该 RelayState 值来捕获允许将用户中继到最初请求的资源的状态信息。

这意味着当您实现 SP 时,您需要一些机制来记录 ID 和 RelayState 值,并且您的响应处理需要验证它接收到的 InResponseTo 和 RelayState 值。如何选择创建和解释 RelayState 值取决于您,但请记住,存在长度限制。 (我们使用与本地保存的状态数据相对应的随机 GUID 值,它的额外优势是不会为 RelayState 值提供任何含义提示。)

IdP 如何知道谁在提出请求? AuthnRequest 必须包含一个标识 SP 的 Issuer 元素。它还可能包含一个 AssertionConsumerServiceURL(响应要发送到的 URL),或者 IdP 可能具有颁发者到正确 URL 的本地映射。

如何使用 HTTP 重定向发送 AuthnRequest?除了使用 GET 而不是 POST 之外,使用 POST 发送的 AuthnRequest 与重定向之间的唯一区别是 AuthnRequest XML 必须被压缩(使用 DEFLATE 编码)。

希望能回答您的大部分问题。

【讨论】:

  • 我应该提到我正在尝试使用IsPassive 选项来执行此操作,这意味着用户代理在消息交换期间不会发挥作用。它只是启动 SAML 派对的催化剂。正确的?考虑到这一点,假设用户在第 1 步是匿名的,SP 向 IdP 发送什么以允许 IdP 确定用户是否已通过身份验证?由于 IsPassive,HTTP POST 不会通过 User-Agent 发送。
  • 身份验证(如您所见)不是 SAML 规范的一部分。 IDP 通常可以使用它想要的任何方法(用户名/密码、数字证书、双因素身份验证等)。但是,如果您在 AuthnRequest 中发送“IsPassive”,则 IDP 不得 提示最终用户输入任何身份验证信息。通常,像 IWA/Kerberos 这样的东西会以这种方式执行。如果 IDP 不能被动地确定用户的身份,那么您必须向 SP 返回适当的错误响应。顺便说一句 - 使用 HTTP Post AuthnRequest 通过用户代理发送的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 2020-10-14
相关资源
最近更新 更多