SAML IDP启动的SSO事务



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

集成是SAML,因此webapp#1(IDP(发送SAML";请求";到webapp#2(SP(,返回重定向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,可以知道出了什么问题。我所能猜测的是,我没有正确地发布这篇文章。那么这看起来对吗,或者我应该以不同的方式发布它吗?我试着在正文中按原样发布断言,用"<samlp:响应";信封,将其包装并在其前面加上";SAMLResponse=";。我尝试了每一个纯和减缩/base64编码。

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

有什么建议吗?

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

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

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

我想发生的情况是,由于某种原因,SP不接受您的SAML响应,而是通过向IdP发送SAML请求来验证用户,从而启动正常的SP启动的SAML流。

为什么你的回答不被接受可能有很多原因。如果没有SP日志,我们基本上可以猜测。

顺便说一句,我看到你的断言缺少了一个强制性的Bearer主题确认。

来自SAML配置文件规范4.1.4.2

使用此配置文件为消费发布的任何断言都必须包含一个位于的元素至少一个元素包含urn:assias:names:tc:SAML:2.0:cm:bearer。这样的断言被称为bearer断言。承载断言可能包含其他元素。在的同一章中,对断言也有更多的要求

其他一些想法:

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

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

此外,尝试agian,看看你是否能从SP那里得到任何关于问题的反馈,以避免盲目尝试而失败。

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

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

干得好!

您应该向SP发送一个包含SAML断言的SAML响应,而不仅仅是一个SAML断言。您还需要确保根据SAML v2.0 Bindings规范对其进行正确编码。

您确实需要SP来协助调试。希望他们的日志能提供他们拒绝你的HTTPPost的详细信息。

最新更新