问题 寻找有关第一个SAML实施的反馈


我的任务是设计一个非常简单的SSO(单点登录)过程。我的雇主已指定应在SAML中实施。我想在确认SAML规范时创建尽可能简单的消息。

如果你们中的一些人会查看我的请求和回复消息并告诉我他们是否对我的目的有意义,如果他们包含任何内容,我将非常感激  需要在那里,如果他们遗失任何东西  需要在那里。

另外,我想知道在回复的哪个部分我应该提供有关该主题的其他信息;特别是主题的电子邮件地址。

交互需要如下工作:

  1. 用户此时请求来自服务提供商的服务,服务提供商对用户一无所知。
  2. 服务提供商请求身份提供商对用户进行身份验
  3. 用户由身份提供商进行身份验证/注册
  4. 身份提供商使用身份验证成功消息PLUS用户的电子邮件地址来响应服务提供商。

以下是我认为请求应该是:

<?xml version="1.0" encoding="UTF-8"?>
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
ID="abc" 
IssueInstant="1970-01-01T00:00:00.000Z" 
Version="2.0"
AssertionConsumerServiceURL="http://www.IdentityProvider.com/loginPage">
   <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
    http://www.serviceprovider.com
    </saml:Issuer>
    <saml:Subject>
        <saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">3f7b3dcf-1674-4ecd-92c8-1544f346baf8</saml:NameID>
    </saml:Subject>

以下是我认为响应应该是:

<?xml version="1.0" encoding="UTF-8"?>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Destination="http://www.serviceprovider.com/desitnationURL" ID="123" IssueInstant="2008-11-21T17:13:42.872Z" Version="2.0">
    <samlp:Status>
        <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </samlp:Status>
    <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Version="2.0">
        <saml:Subject>
            <saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">3f7b3dcf-1674-4ecd-92c8-1544f346baf8</saml:NameID>
            <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:profiles:SSO:browser">
                <saml:SubjectConfirmationData InResponseTo="abc"/>
            </saml:SubjectConfirmation>
        </saml:Subject>
        <saml:AuthnStatement AuthnInstant="2008-11-21T17:13:42.899Z">
            <saml:AuthnContext>
                <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
            </saml:AuthnContext>
        </saml:AuthnStatement>
    </saml:Assertion>
</samlp:Response>

所以,我的问题是:

  1. 这是一个有效的SAML交互吗?

  2. 可以简化请求或响应XML吗?

  3. 我应该在回复的哪个位置放置主题的电子邮件地址?

我非常感谢你的帮助。非常感谢!

-摩根


1949
2017-12-21 19:37


起源

这属于 codereview.stackexchange.com - Nix


答案:


您在请求中不需要主题 - 查看规范,我认为这可能很简单:

<?xml version="1.0" encoding="UTF-8"?>
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  ID="abc" Version="2.0" IssueInstant="1970-01-01T00:00:00.000Z"
</samlp:AuthnRequest>

省略所有可选元素和属性(Issuer,NameIDPolicy,AssertionConsumerServiceURL等)意味着您的身份提供者和服务提供者已预先同意这些,因此不需要在AuthnRequest中指定它们。如果你控制了两端,并且你绝对知道你永远不会在混合中添加另一个提供者那么这是一个完全合法的SAML请求。它的意思是“通过我们同意的机制验证提供此信息的用户”。

看看响应,我认为这是最小的情况:

<?xml version="1.0" encoding="UTF-8"?>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  ID="123" InResponseTo="abc" IssueInstant="2008-11-21T17:13:42.872Z" 
  Version="2.0">
    <samlp:Status>
        <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </samlp:Status>
    <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Version="2.0">
        <saml:Subject>
            <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">
                user@example.com
            </saml:NameID>
        </saml:Subject>
        <saml:AuthnStatement AuthnInstant="2008-11-21T17:13:42.899Z">
            <saml:AuthnContext>
                <saml:AuthnContextClassRef>
                    urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
                </saml:AuthnContextClassRef>
            </saml:AuthnContext>
        </saml:AuthnStatement>
    </saml:Assertion>
</samlp:Response>

您可以将用户的电子邮件地址作为NameID发送,并且AuthnStatement仅承载身份提供商在给定时间由给定机制对用户进行身份验证的事实。再次,这被剥离到骨骼 - 我们省略了属性和元素,如Destination和SubjectConfirmationMethod,因为它们对用例是多余的。

因此,此响应显示“这是user@example.com;他于2008年11月21日17:13:42通过受保护的传输(SSL / TLS)登录密码”。

您应该查看SAML 2.0配置文件规范,了解传递这些来回的确切机制。 AuthnRequest通常在GET中作为URL参数进行压缩,编码和传递,而返回响应的最简单方法是通过POST绑定 - 返回一个HTML页面,其表格的目标是服务提供者,并在页面加载时间通过一些JavaScript。


12
2018-01-07 04:45



:请求消息中的即时问题有什么用。它是否在IdProvider的任何地方使用? - suraj
@metadaddy:为什么在respnse中有即时问题和auth瞬间。您说auth instant是IDP验证用户的时间。还有一个疑问是,响应中的ID不应该在它之前有一个<InResponseTo>标记。 - Ashwin
@suraj,IssueInstant在创建请求时告诉身份提供者。身份提供者可以使用它来实施某些政策 - 例如拒绝在创建后超过5分钟收到的请求。 - metadaddy
@Ashwin,IssueInstant是创建SAML响应的时间; AuthnInstant是用户进行身份验证的时候 - 这可能是在IssueInstant之前的一段时间。你在InResponseTo上是正确的 - 它在SAML规范中是可选的,但如果消息是对请求的响应你必须提供它 - 我将编辑我的答案是正确的 - 谢谢! - metadaddy
@metadaddy:不客气!为什么SAML规范指定了AuthInstant以及Issueinstant?不是足够的吗? - Ashwin


  1. 是的,它似乎是SAML的互动

  2. 您的身份验证响应现在非常简单。通常,您需要在断言中添加更多属性。为安全起见,至少应该签署回复。

  3. 它用于在。之后设置。在你的情况下你没有它,所以在状态之后应该没问题......

我建议你创建一个帐户 http://www.ssocircle.com,以及一个HTTP头分析器(即经典和优秀的LiveHttpHeaders)和一个SAML2调试器(Feide Rn SAML2调试器  谢谢你们!)看看请求/响应流程......

希望能帮助到你,

路易斯

ps:如果你想看一个完整的实现SP / IdP: http://sourceforge.net/projects/spring-saml/files%2F0.1/ 


1
2018-05-13 16:18