【问题标题】:Looking for feedback on a first SAML implementation寻找有关第一个 SAML 实施的反馈
【发布时间】:2008-12-21 19:37:50
【问题描述】:

我的任务是设计一个非常简单的 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. 我应该在回复中的哪个位置填写主题的电子邮件地址?

非常感谢您的帮助。非常感谢!

-摩根

【问题讨论】:

标签: saml


【解决方案1】:

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

<?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 参数传递,而返回 Response 的最简单方法是通过 POST 绑定 - 返回一个 HTML 页面,其目标是服务提供者,并在通过一些 JavaScript 加载页面的时间。

【讨论】:

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

  2. 您的身份验证响应现在相当简单。通常你会想在你的断言中添加更多的属性。而且为了安全起见,至少应该对响应进行签名。

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

我建议您在http://www.ssocircle.com 中创建一个帐户,并使用一个 HTTP 标头分析器(即经典且出色的 LiveHttpHeaders)和一个 SAML2 调试器(Feide Rn SAML2 debugger 谢谢大家!)查看请求/响应流...

希望对你有帮助,

路易斯

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多