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

SAML IDP启动的SSO事务

夏长卿
2023-03-14

Webapp #1 有一个指向 webapp #2 的按钮。当我们的用户单击该按钮时,他们应该被重定向到webapp #2,并自动登录。

集成是 SAML,因此 webapp #1(IDP)向 webapp #2(SP)发送 SAML“请求”,该请求返回重定向 URL,webapp #1 重定向到它。

SP给了我一个HTTP POST的URL,一个通过“电子邮件”属性识别用户的断言,所以我产生了这个:

<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" IssueInstant="2021-12-22T16:59:43.999Z" Version="2.0"><saml2:Issuer>http://www.whatever.com</saml2:Issuer><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"></ds:CanonicalizationMethod><ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></ds:SignatureMethod><ds:Reference URI=""><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform><ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod><ds:DigestValue>...</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>...</ds:SignatureValue><ds:KeyInfo><ds:X509Data><ds:X509Certificate>...</ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature><saml2:Conditions><saml2:OneTimeUse></saml2:OneTimeUse></saml2:Conditions><saml2:AuthnStatement AuthnInstant="2021-12-22T16:59:44.053Z" SessionIndex="cfb8f9b5-9616-47db-bc92-7588ce18cf62" SessionNotOnOrAfter="2021-12-22T16:59:44.068Z"><saml2:AuthnContext></saml2:AuthnContext></saml2:AuthnStatement><saml2:AttributeStatement><saml2:Attribute Name="email"><saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">si@captisintel.com</saml2:AttributeValue></saml2:Attribute></saml2:AttributeStatement></saml2:Assertion>

SP以302和如下所示的位置标头进行响应:

Location: ?SAMLRequest=nVNNj9owEP0rke%2FkS4VtLc...

解码:

<?xml version="1.0"?><samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="_f848f04c71671a745722" Version="2.0" IssueInstant="2021-12-22T18:36:19.337Z" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="http://auth.whatever2.com/saml/callback" Destination=""><saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">whatever2</saml:Issuer><samlp:NameIDPolicy xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" AllowCreate="true"/><samlp:RequestedAuthnContext xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Comparison="exact"><saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef></samlp:RequestedAuthnContext></samlp:AuthnRequest>

当我访问该URL时,我会看到登录页面。所以这不起作用。

我对SP日志的可见性为0,以了解出了什么问题。我所能猜到的是,我没有正确地发布这篇文章。那么这看起来对吗,还是我应该以不同的方式发布?我试着把这句话原封不动地写在正文里,用一个“

另一个线索是,无论我发送什么,SP总是返回302。即使我发送“BLAHBLAH”而不是实际的SAML有效载荷,他们仍然以302响应。

有什么建议吗?

共有2个答案

夏侯朝斑
2023-03-14

您应该向SP发送包含SAML断言的SAML响应,而不仅仅是SAML断言。您还需要确保按照SAML v2.0绑定规范正确编码。

您真的需要SP来协助调试。希望他们的日志将提供有关他们拒绝您的HTTP Post的原因的详细信息。

蓝苗宣
2023-03-14

在 IdP 启动的流中,IdP 会像您一样发送包含 POST 中的断言的 SAML 响应。如果一切顺利,SP 现在应认为用户已通过身份验证。

SAML 响应应在名为 SAMLResponse 的输入控件中发送,并且应采用 Base64 编码。

<input type="hidden" name="SAMLResponse" value="<Base64 encoded SAML Response>"/>

我猜想发生的事情是,由于某种原因,SP不接受您的SAMLResponse,而是通过向IdP发送SAML请求来启动正常的SP启动的SAML流以对用户进行身份验证。

为什么你的回复不被接受可能有很多原因。没有SP日志,我们大多可以猜测。

在蝙蝠身上,我看到你的断言缺少一个强制性的持有者主题确认。

从SAML配置文件规范4.1.4.2

使用此配置文件发布的任何消费断言必须包含一个元素,其中至少有一个元素包含urn:oasis:names:tc:SAML:2.0:cm:bearer方法。这种断言称为承载断言。承载断言可以包含附加元素。同一章中对断言也有更多的要求

不过,还有一些其他想法:

  • 您应该在SAML响应中有您的断言,但是有几个锅炉板元素需要设置。因此,请确保它有效。
  • 响应消息本身必须签名,而不仅仅是断言,这并不少见

我建议查看 SAML 配置文件规范 4.1.4.2,以了解断言和响应必须包含的内容。

另外,再试一次,看看你是否能从SP那里得到任何关于错误之处的反馈,以避免盲目尝试和失败。

SAML并不是最直接的协议,要让它正常工作和安全,还有很多事情要做。正如我总是试图对刚开始使用SAML的人说的:不要自己构建它,有很多好的开源替代方案可以用来做SAML,这会让你的系统更加安全和可维护。

如果您想更好地理解SAML以及如何实现它,我可以推荐我的书SAML2.0:设计安全身份联合

好阿克!

 类似资料:
  • 我已经配置了OpenAM IdP和SP。我正在纠结于IdP发起的SSO URL和SP发起的SSO URL。我使用以下格式的IdP发起的单点登录网址。但是我得到错误< code >服务提供商ID为空。 http://testtestidam.com:8080/openam/idpssoinit?metaAlias=/realm1/idp 任何人都可以帮忙吗?

  • 如何从SAML响应中判断是SP启动的SSO还是IDP启动的SSO?是否有一个属性告诉我是谁发起了SSO? 例如,在这个StackOverflow问题中:SP发起的SSO和IDP发起的SSO之间的差异,他们讨论了差异,但没有谈论XML级别本身...... SAML响应如下所示:

  • 我正在进行SP启动的SSO。 IDP是PingOne 我一直在做IDP发起的SSO。 因此,我们有IDP启动的SSO设置,一切都很正常。我们现在必须让它启动。 我理解它背后的理论,但我不知道如何实施它! 到目前为止,我在想我需要给他们的网址是这样的,也许???: https://sso/saml2/jsp/spSSOInit.jsp?metaAlias=/{idpRealm}/sp 但是当我击中它

  • 我使用SPRING SAML实现并充当SP(例如:ALPHA)。我能够执行SP启动的SSO,并能够使用IDP对用户进行身份验证。此实现中没有问题。 但在我的应用程序中,我需要访问另一个与同一IDP链接的SP(例如:BETA)url。ALPHA和BETA服务提供商都受到同一IDP的信任。在这种情况下,在通过SP INIT SSO使用IDP对用户进行ALPHA身份验证后,当BETA SP URL发生重

  • 目前,我们的identity server安装了Sustainsys/Saml2扩展,允许三方客户端通过sso登录到我们的产品,其中客户endpoint击我们的登录页面启动请求。 我们现在有一个客户,您希望在其自己的软件中添加链接以启动该过程,创建ldp启动的请求。 我的问题是如何使用identity server和Saml2AuthExtensions实现这一点。我已经看过了,我看不到任何额外的

  • 我在使用SimplesamlPHP实现IdP发起的登录时遇到了麻烦。了解我必须从留档中做什么并不是最容易的事情。 我将用户重定向到IdP服务器,登录后,服务器向SP发送一个XML文件,其中包含电子邮件用户的地址、ID和其他数据。这看起来像是一次成功的登录,但是此时我不知道如何处理这个XML。我应该自己解析它还是使用simplesaml?我如何验证签名? 以下是我收到的XML: