是否可以将初始 SAML 请求与从 IDP 收到的 SAML 断言联系起来?
Is it possible to tie initial SAML request to the SAML Assertion received from the IDP?
我正在寻找一种方法,将我向 IDP 发出的 SAML 请求与它发回的 SAML 断言联系起来。有办法吗?
我的一个想法是使用 SessionIndex。我发现在实践中,在某些情况下 SessionIndex 可用于执行此操作,因为某些 SAML 服务器 return 来自初始请求的 ID 作为 SAML 断言中的 SessionIndex,但我也发现这不是普遍完成/规范似乎没有要求。似乎 SessionIndex 的目的只是将 SAML 断言与后续调用联系在一起,例如注销尝试,因此不需要将其绑定到初始请求。我从 this post, which says "At least one assertion containing an MUST contain a element with at least one element containing a Method of urn:oasis:names:tc:SAML:2.0:cm:bearer. If the identity provider supports the Single Logout profile, defined in Section 4.4, any such authentication statements MUST include a SessionIndex attribute to enable per-session logout requests by the service provider." I have also reviewed this post 中得出这个结论,它分解了 SessionIndex 的使用,我认为支持相同的结论。
我在规范中没有看到任何其他看起来很有希望的内容,但我希望我可能遗漏了一些东西 - 是否有任何可靠的方法可以在 SAML 请求中将数据传递给 IDP 并在SAML 断言?
仅供参考,我想要这个的原因是为了支持移动 sso 登录,我的移动设备使用嵌入式网络浏览器对我的网络服务器进行 OAuth2 调用,网络服务器对用户进行身份验证,然后发回一个通过重定向将授权代码发送到移动设备。我想使用 PKCE 来保护移动设备和 Web 服务器之间的 OAuth2 流,但这要求我能够使用共享代码将初始请求调用与最终重定向联系起来。
至少有两种方法可以使用,只要用户旅程从应该开始的地方开始,在他们试图到达的页面上,使其成为服务提供商发起的身份验证请求。作为基于 SAML 的联盟中的服务提供者,您通过向身份提供者发送 AuthnRequest.
来启动该过程
第一个可用的方法是跟踪 AuthnRequest 的 ID
。在良好的 SAML 实现中,AuthnRequest 的 ID 很大且随机,并且可能在我们的生命周期中不可重复。 The SAML Profiles spec 第 625-626 行说:
If the containing message is in response to an <AuthnRequest>
, then
the InResponseTo
attribute MUST match the request's ID
.
因此,只要您跟踪发送的 ID,就可以将请求的 ID
与响应的 inResponseTo
联系起来。
第二种方法是RelayState
。这是 AuthnRequest 的一个恰当命名的元素,您可以使用它来将状态传输给身份提供者并返回。这是一个您可以作为服务提供商使用的字段,响应者必须将其发回。 The Bindings spec 在第 265-271 行说:
Some bindings define a "RelayState" mechanism for preserving and
conveying state information. When such a mechanism is used in
conveying a request message as the initial step of a SAML protocol, it
places requirements on the selection and use of the binding
subsequently used to convey the response. Namely, if a SAML request
message is accompanied by RelayState data, then the SAML responder
MUST return its SAML protocol response using a binding that also
supports a RelayState mechanism, and it MUST place the exact
RelayState data it received with the request into the corresponding
RelayState parameter in the response.
因此,您可以在那个字段中放一些东西,IdP 必须原封不动地鹦鹉学舌。您应该确保您放入其中的内容不会损害用户或安全性,因此请注意您的使用方式。它最终会出现在某个地方的日志中。
我正在寻找一种方法,将我向 IDP 发出的 SAML 请求与它发回的 SAML 断言联系起来。有办法吗?
我的一个想法是使用 SessionIndex。我发现在实践中,在某些情况下 SessionIndex 可用于执行此操作,因为某些 SAML 服务器 return 来自初始请求的 ID 作为 SAML 断言中的 SessionIndex,但我也发现这不是普遍完成/规范似乎没有要求。似乎 SessionIndex 的目的只是将 SAML 断言与后续调用联系在一起,例如注销尝试,因此不需要将其绑定到初始请求。我从 this post, which says "At least one assertion containing an MUST contain a element with at least one element containing a Method of urn:oasis:names:tc:SAML:2.0:cm:bearer. If the identity provider supports the Single Logout profile, defined in Section 4.4, any such authentication statements MUST include a SessionIndex attribute to enable per-session logout requests by the service provider." I have also reviewed this post 中得出这个结论,它分解了 SessionIndex 的使用,我认为支持相同的结论。
我在规范中没有看到任何其他看起来很有希望的内容,但我希望我可能遗漏了一些东西 - 是否有任何可靠的方法可以在 SAML 请求中将数据传递给 IDP 并在SAML 断言?
仅供参考,我想要这个的原因是为了支持移动 sso 登录,我的移动设备使用嵌入式网络浏览器对我的网络服务器进行 OAuth2 调用,网络服务器对用户进行身份验证,然后发回一个通过重定向将授权代码发送到移动设备。我想使用 PKCE 来保护移动设备和 Web 服务器之间的 OAuth2 流,但这要求我能够使用共享代码将初始请求调用与最终重定向联系起来。
至少有两种方法可以使用,只要用户旅程从应该开始的地方开始,在他们试图到达的页面上,使其成为服务提供商发起的身份验证请求。作为基于 SAML 的联盟中的服务提供者,您通过向身份提供者发送 AuthnRequest.
来启动该过程第一个可用的方法是跟踪 AuthnRequest 的 ID
。在良好的 SAML 实现中,AuthnRequest 的 ID 很大且随机,并且可能在我们的生命周期中不可重复。 The SAML Profiles spec 第 625-626 行说:
If the containing message is in response to an
<AuthnRequest>
, then theInResponseTo
attribute MUST match the request'sID
.
因此,只要您跟踪发送的 ID,就可以将请求的 ID
与响应的 inResponseTo
联系起来。
第二种方法是RelayState
。这是 AuthnRequest 的一个恰当命名的元素,您可以使用它来将状态传输给身份提供者并返回。这是一个您可以作为服务提供商使用的字段,响应者必须将其发回。 The Bindings spec 在第 265-271 行说:
Some bindings define a "RelayState" mechanism for preserving and conveying state information. When such a mechanism is used in conveying a request message as the initial step of a SAML protocol, it places requirements on the selection and use of the binding subsequently used to convey the response. Namely, if a SAML request message is accompanied by RelayState data, then the SAML responder MUST return its SAML protocol response using a binding that also supports a RelayState mechanism, and it MUST place the exact RelayState data it received with the request into the corresponding RelayState parameter in the response.
因此,您可以在那个字段中放一些东西,IdP 必须原封不动地鹦鹉学舌。您应该确保您放入其中的内容不会损害用户或安全性,因此请注意您的使用方式。它最终会出现在某个地方的日志中。