【问题标题】:How To Become a SAML Service Provider如何成为 SAML 服务提供商
【发布时间】:2011-07-27 00:16:26
【问题描述】:

我的公司目前正在开发一个 Java Web 应用程序。我们的一些客户拥有内部 SAML 服务器(身份提供者?),并要求我们与他们集成。所以最近我一直在阅读它并使用 OpenAM。这样大概3天后,我对它有了一个大概的了解,但是我的知识还是有一些差距的。我希望有人可以为我解决这个问题。

这就是我想象的用户登录的工作流程。

让我们将客户的 SAML 服务器定义为 https://their.samlserver.com。因此,用户来到我们的 Web 应用程序以获取受保护的资源。假设 URL 是http://my.app.com/something

所以,如果我没记错的话,my.app.com 就是 SAML 定义的服务提供者。我们的应用程序意识到这个用户需要登录。然后我们向用户呈现一个这样的页面......

<script>JQuery Script to auto submit this form on ready</script>
<form method="post" action="https://their.samlserver.com/Post/Servlet">
    <input type="hidden" name="SAMLRequest" value="someBase64Data" />
    <input type="submit" value="Submit" />
</form>

someBase64Data 应该是这个base64 的编码版本...

<samlp:AuthnRequest
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
  ID="identifier_1"
  Version="2.0"
  IssueInstant="2004-12-05T09:21:59Z"
  AssertionConsumerServiceIndex="0">
 <saml:Issuer>http://my.app.com</saml:Issuer>
 <samlp:NameIDPolicy
   AllowCreate="true"
   Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>

我的前几个问题。

ID 值应该是什么?

为什么我可以声明自己是发行人

身份提供者知道我吗?也许这就是我在 OpenAM 上看到的 信任圈。如果它知道我,它是如何知道我的,它需要知道什么?

因此,在用户被转发该页面后,他们将被带到 IDP https://their.samlserver.com 提供的页面。他们在该页面上进行身份验证,IDP 会神奇地验证身份验证并查找用户。认证成功后,IDP发回一个&lt;samlp:Response&gt;定义的here

还有几个问题。

首先,&lt;samlp:Response&gt; 如何返回到我的 Web 应用程序以便我检查它?

我应该在该响应中寻找什么来验证它是否成功?失败是什么样的?

我们目前使用电子邮件地址 (LDAP) 来识别用户,因此我们可能会从响应中获取它并以与现在相同的方式使用它。在回复中我还应该注意什么?

现在我们已经检查了该响应的有效性,我们可以像现在一样授予用户一个会话。但是当他们想注销时,是否有相应的工作流程?我是否必须通知 IDP 用户已离开?

最后,在我的阅读中出现了几个主题,我不确定它们如何适应这个工作流程。它们是信任圈令牌工件

感谢大家的帮助。前两天查了很多资料,多玩一会,有可能把它们拼凑起来。但是我还没有找到一个简单的“这是帖子”工作流程文章。也许那是因为我对它的工作原理有误。也许是因为这不是那么受欢迎。但我真的很想确保我得到了工作流程,所以我不会错过像用户身份验证这样重要的事情中的关键步骤。

【问题讨论】:

  • 我现在也遇到了同样的问题(研究如何创建与 Ping Identity 交互的轻量级联合 SAML v2 服务提供者)。你介意评论一下它对你的效果吗?您最终是使用 fedlet 还是编写自己的代码?谢谢!
  • 我的环境有些相似。我有一个在 tomcat 上运行的基于 java 的 Web 应用程序,现在我必须使用 SAML 进行 SSO。除了理论知识,我对这些技术一无所知。有人可以帮我从头开始配置吗?

标签: security authentication saml


【解决方案1】:

针对您的具体问题:

1.) “ID”值应该是什么?

  • 这应该是 SAML 请求的唯一标识符。 SAML 2.0 规范声明它确实是特定于实现的,但提出了以下建议:

SAML 系统实体用来确保 标识符是唯一的,留给实现。在这种情况下 采用随机或伪随机技术,两个概率 随机选择的相同标识符必须小于或等于 到 2 ^ -128 并且长度应该小于或等于 2 ^ -160。 这个要求可以通过编码一个随机选择的值来满足 长度在 128 到 160 位之间。

2.) IdP 如何了解您?

  • 您的 SP 需要在 IdP 中注册。为了实现这一点,SAML 规范定义了“SAML 元数据”的格式,它告诉 IdP 您的 SAML 接收器在哪里、您的证书是什么、您交换的属性等。OpenAM 可能规定了配置可信 SP 的一些最低要求。这因产品而异。

3.) 响应去了哪里,要检查什么?

  • 响应将转到您的断言消费者服务 (ACS) URL,该 URL 通常在您从 SP 与 IdP 交换以进行初始设置的 SAML 元数据中定义。当您收到 SAML 响应时,您需要检查许多事情 - 但最重要的是,SAML 状态代码应该是“成功”,inResponseTo ID 应该与请求发送的 ID 匹配,并且您必须验证断言上的数字签名。为此,您需要信任 IdP 的公共验证证书,并且您可能还需要进行吊销检查。

4.) 注销呢?

  • SAML 2.0 还定义了单一注销 (SLO) 的配置文件。这不仅会使您从 SP 中注销,还会使 IdP 和可能与您建立会话的任何其他 SP 注销。它具有与单点登录 (SSO) 类似的请求/响应流程,因此需要设置和检查类似的内容(状态代码、签名等)。

简而言之 - 从头开始​​实施可能非常复杂。最好使用 Ian 建议的久经考验的真实库和/或产品。像他这样的公司投入了数百小时的开发时间来根据规范实施并测试与其他供应商的互操作性。

【讨论】:

  • 为什么saml请求中要有ID。我不明白。
  • 它是 SAML 2.0 核心规范的一部分。见docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf。 AuthnRequest 属于 AuthnRequestType 类型(第 3.4.1 节),它是具有强制 ID 属性的 RequestAbstractType(第 3.2.1 节)的扩展。请求中 ID 的主要好处之一是响应可以引用它,以便 SP 可以将两者映射在一起以防止重放。
  • 你说id是为了防止重放攻击。如果我在 Service Provider 和 IDProvider 之间使用 ssl/https 连接,可以防止重放攻击。
  • SP 和 IdP 之间的 SSL/HTTPS 对于防止重放攻击有点毫无意义,因为通常使用“前端通道”(浏览器)绑定。
  • @Ashwin - id 在那里,因此当您收到响应时,它具有相同的 id,并且您可以知道您收到的响应与您的请求有关,以防止重播,我的理解是,在 SAML 中的请求和响应中都有很多时间戳,并且 id 只能在有限的时间段内与授权一起使用。
【解决方案2】:

如果您只是想将单个 Java 应用程序设置为服务提供者,您应该考虑使用来自 Oracle(作为独立)或 ForgeRock(与 OpenAM 捆绑)的 Fedlet。 ForgeRock Fedlet 在与作为身份提供者的 Shibboleth 2.2.1 交互时存在一些问题,但我发现它更易于配置且信息量更大。

每个都包含在自述文件中的明确说明,以帮助您进行部署。配置 Fedlet 并与 IDP 通信后,成功页面会显示将联合 SSO 集成到应用程序所需的所有代码。它完成发送和接收 AuthnRequests 和 Responses 的后台工作。

Scott 的回答很好地回答了您的问题,但我认为尝试自己编写生成 SAML 的代码是在重新发明轮子。 Fedlet 的设计正是考虑到了这个用例。

【讨论】:

    猜你喜欢
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2016-12-14
    • 1970-01-01
    • 2015-05-16
    • 2015-09-26
    相关资源
    最近更新 更多