如何成为SAML服务提供商

84

我们的公司目前正在开发一个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值应该是什么?

为什么我可以把自己声明为Issuer?

身份提供者知道我吗?也许这就是我在OpenAM上看到的那个“信任圈”。如果它确实知道我,它又是如何知道我以及需要知道什么呢?

当用户被转发到页面时,他们会被带到一个由IDP提供的页面 https://their.samlserver.com。他们在那个页面上进行身份验证,IDP通过其魔力来验证认证并查找用户。认证成功后,IDP发送一个定义在这里的。

还有一些问题。

首先,<samlp:Response>如何回到我的Web应用程序,以便我可以对其进行检查?

在响应中,我应该寻找什么来验证成功?失败的情况又是怎样的?

我们目前使用电子邮件地址(LDAP)来识别用户,因此我们可能会从响应中获取该信息,并像现在一样使用它。在响应中还有其他需要注意的内容吗?

因此,现在我们已经检查了响应的有效性,可以像我们目前做的那样向用户授予会话。但是当他们想要注销时,是否有相关流程?我需要通知IDP用户已经离开吗?

最后,在我的阅读中,还有几个主题被提及,我不确定它们如何适用于这个工作流程。它们是“信任圈”、“Tokens”和“Artifacts”。

感谢大家的帮助。在过去的几天里,我已经找到了很多信息,可能稍微再尝试一下就能拼凑在一起了。但是我仍然没有找到一个简单明了的“发布后”的工作流文章。也许这是因为我对它的工作方式理解错误,也许因为它不那么受欢迎。但是我真的想确保我掌握了工作流程,以免错过如此重要的用户身份验证步骤。


3
我正在经历同样的问题(研究如何创建一个与Ping Identity交互的轻量级联合SAML v2服务提供商)。你介意评论一下你的情况吗?你最终使用了Fedlet还是编写了自己的代码?谢谢! - theglauber
1
我有一个类似的环境。我有一个基于Java的Web应用程序在Tomcat上运行,现在我需要使用SAML进行SSO。除了理论知识外,我对这些技术一无所知。有人可以帮我从头开始配置吗? - Jerry
2个回答

47
  • 注销通常通过发送SAML Logout请求来实现,该请求应指向SP的Single Logout服务端点。 IdP将向您的SP发送Logout Response以确认注销已成功完成。 您需要验证此响应并确保其状态代码为“成功”。 此外,还需要发送Logout请求到任何其他相关的SP以实现全局注销。
  • SAML 2.0 还定义了一个单点登出 (SLO) 档案。它不仅会将您从服务提供商(SP) 登出,还会将您从身份提供商(IdP) 和您已建立会话的任何其他 SP 登出。它具有类似于单点登录(SSO)的请求/响应流程,因此需要设置和检查类似的东西(状态代码、签名等)。
  • 简而言之,从头开始实现这一点可能非常复杂。最好使用经过验证的库或产品,如 Ian 所建议的那样。像他这样的公司已经投入了数百小时的开发人员时间来根据规范进行实现,并测试了与其他供应商的互操作性。


    2
    SAML请求中为什么需要一个ID?我不明白。 - Ashwin
    1
    这是SAML 2.0核心规范的一部分要求。请参阅http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf。AuthnRequest是AuthnRequestType类型(第3.4.1节),它是RequestAbstractType(第3.2.1节)的扩展,具有强制性ID属性。请求中的ID的一个关键优点是响应可以引用它,以便SP可以将两者映射在一起以防止重放攻击。 - Scott T.
    你说ID是为了防止重放攻击而给出的。如果我在服务提供商和身份提供者之间使用SSL/HTTPS连接,那么可以防止重放攻击吗? - Ashwin
    1
    SP和IdP之间的SSL/HTTPS在防止重放攻击方面有点毫无意义,因为通常使用“前端通道”(浏览器)绑定。 - Scott T.
    @Ashwin - ID的存在是为了当您收到响应时,它具有相同的ID,您可以知道您收到的响应与您的请求相关。至于防止重放攻击,我理解SAML中的请求和响应都有很多时间戳,并且ID仅在授权期限有限的情况下可行。 - Uncle Iroh

    3
    如果您只是想将单个Java应用程序设置为服务提供者,您应该考虑使用来自Oracle(作为独立产品)或ForgeRock(与OpenAM捆绑在一起)的Fedlet。 ForgeRock Fedlet 在与Shibboleth 2.2.1作为标识提供者交互方面存在一些问题,但我发现它更容易配置且信息更丰富。

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

    Scott的回答对您的问题做出了很好的回应,但我认为尝试自己编写生成SAML的代码是在重新发明轮子。Fedlet就是为此使用案例而设计的。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接