如何成为SAML服务提供商


80

我公司目前正在开发Java Web应用程序。我们的几个客户拥有内部SAML服务器(身份提供程序?),并要求我们与它们集成。所以最近我一直在阅读它,并使用OpenAM。经过大约三天的时间,我对它有了一个大致的了解,但是我的知识仍然存在一些不足。我希望有人可以帮我解决这个问题。

因此,这就是我如何想象用户登录的工作流程。

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

因此,如果我是对的,那么SAML将my.app.com定义为Service Provider。我们的应用程序意识到该用户需要登录。然后,我们向用户显示一个类似的页面...

<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将发回这里<samlp:Response>定义。

还有几个问题。

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

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

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

因此,既然我们已经检查了该响应的有效性,就可以像当前一样为用户授予会话。但是,当他们要注销时,是否有工作流程?我是否必须通知IDP用户已离开?

最后,我的阅读中涉及了两个主题,我不确定它们如何适合此工作流程。它们是信任圈令牌人工制品

感谢大家的帮助。在过去的几天里,我发现了很多信息,经过更多的比赛之后,我有可能将它们组合在一起。但是我还没有找到直接的“这里是帖子”工作流文章。也许是因为我错了。也许是因为这并不流行。但是我真的很想确保我得到了工作流程,这样我就不会错过与用户身份验证同样重要的关键步骤。


3
我现在正在经历相同的问题(研究如何创建与Ping Identity交互的轻量级联合SAML v2服务提供商)。您介意对它的效果进行评论吗?您最终使用了fedlet还是编写了自己的代码?谢谢!
theglauber 2012年

1
我的环境有些相似。我现在在tomcat上运行了一个基于Java的Web应用程序,我必须使用SAML进行SSO。除了理论知识外,我对这些技术一无所知。有人可以帮我从头开始配置吗?
杰里

Answers:


46

针对您的具体问题:

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建议的经过验证的真实库和/或产品。像他这样的公司已经花费了数百小时的开发人员时间来根据规范实施并测试与其他供应商的互操作性。


2
为什么在saml请求中应该有一个ID。我不明白
阿什温

1
它是SAML 2.0核心规范的一部分。请参阅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的主要好处之一是,因此Response可以随后引用它,以便SP可以将两者映射在一起以防止重播。
Scott T.

您说给定id是为了防止重放攻击。如果我在服务提供商和IDProvider之间使用ssl / https连接,则可以防止重放攻击。
阿什温

1
SP和IdP之间的SSL / HTTPS对于防止重播攻击没有意义,因为通常使用“前通道”(浏览器)绑定。
Scott T.

@Ashwin-ID存在,因此当您返回响应时,它具有相同的ID,您可以知道收到的响应与您的请求有关,就防止重放而言,我的理解是SAML和ID中的请求和响应中的许多时间戳仅在有限的时间内与授权一起可行。
伊罗叔叔

3

如果您只是试图将单个Java应用程序设置为服务提供者,则应考虑使用来自Oracle(作为独立服务器)或ForgeRock(与OpenAM捆绑在一起)中的Fedlet。ForgeRock Fedlet在与作为身份提供者的Shibboleth 2.2.1交互时存在一些问题,但是我发现它在配置上更简单,更有用。

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

Scott的答案很好地回答了您的问题,但是我认为尝试自己编写生成SAML的代码正在彻底改变自己的想法。Fedlet在设计时就牢记此用例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.