gpt4 book ai didi

saml - 寻找有关第一个 SAML 实现的反馈

转载 作者:行者123 更新时间:2023-12-04 02:04:08 29 4
gpt4 key购买 nike

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

如果你们中的一些人能查看我的请求和响应消息,并告诉我它们是否对我的目的有意义,它们是否包含任何不需要的内容,以及它们是否缺少任何有用的信息,我将非常感激需要在那里。

此外,我想知道我应该在回复中的哪个位置添加有关该主题的其他信息;特别是主题的电子邮件地址。

交互需要按以下方式工作:

  • 此时用户向服务提供者请求服务,服务提供者对用户一无所知。
  • 服务提供者向身份提供者请求用户身份验证
  • 用户由身份提供者认证/注册
  • 身份提供商向服务提供商响应身份验证成功消息、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>

    所以,我的问题是:
  • 这是有效的 SAML 交互吗?
  • 可以简化请求或响应 XML 吗?
  • 我应该在回复中的哪个位置填写主题的电子邮件地址?

  • 我真的很感谢你的帮助。非常感谢!

    -摩根

    最佳答案

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

    <?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 通过 protected 传输 (SSL/TLS) 使用密码登录”。

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

    关于saml - 寻找有关第一个 SAML 实现的反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384851/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com