如何成为SAML服务提供商

大家早上好,

我公司目前正在开发一个Java Web应用程序。 我们的几个客户有内部的SAML服务器(身份提供者?),并要求我们与他们进行整合。 所以最近我一直在读它,并与OpenAM玩耍。 大约三天之后,我对此有了一个大概的了解,但是我的知识还有一些差距。 我希望有人能为我解决这个问题。

所以这里是我如何想象用户login的工作stream程。让我们将我们的客户SAML服务器定义为https://their.samlserver.com 。 因此,用户来到我们的Web应用程序的受保护的资源。 假设这个URL是http://my.app.com/something 。 所以如果我是正确的,“my.app.com”就是SAML定义的“服务提供者”。 我们的应用程序意识到这个用户需要login。然后,我们向用户展示这样一个页面…

<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”值是多less? 为什么我可以宣布自己是“发行人”? 身份提供者知道我吗? 也许这就是我在OpenAM上看到的“信任圈”。 如果它知道我的话,它是如何知道我的,它需要知道什么?

因此,在用户转发该页面后,他们被带到由IDP https://their.samlserver.com提供的页面。 他们在该页面上进行身份validation,IDP确实validation身份validation并查找用户。 身份validation成功后,IDP会发回一个在此定义的<samlp:Response>

还有几个问题。 首先, <samlp:Response>如何返回到我的web应用程序,以便我可以检查它? 我应该在这个回应中寻找什么certificate它是成功的? 什么是失败的样子?

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

所以现在我们已经检查了这个响应的有效性,我们可以给用户一个像我们现在这样的会话。 但是当他们想注销时,有没有一个工作stream程? 我必须通知IDP用户已经离开了吗?

最后,在我的阅读中出现了一些话题,我不确定它们如何适应这个工作stream程。 他们是“信任圈”,“令牌”和“文物”。

感谢任何人的帮助。 在过去的几天中,我发现了很多信息,而且有可能在更多的时候把它们拼凑在一起。 但是我还没有find一个直接的“这是邮政”工作stream程文章呢。 也许这是因为我错了如何工作。 也许这是因为这还不是那么受欢迎。 但是我真的很想确保我得到了工作stream程,所以我没有错过与用户身份validation一样重要的关键步骤。

针对您的具体问题:

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

  • 这应该是SAML请求的唯一标识符。 SAML 2.0规范指出,它的具体实现是如何实现的,但提出了以下build议:“SAML系统实体确保标识符是唯一的机制留给实现,在随机或伪随机的情况下技术,两个随机select的标识符相同的概率必须小于或等于2 ^ -128并且应该小于或等于2 ^ -160,这个要求可以通过编码随机select的值来满足在128到160位之间“。

2.)IdP如何了解你?

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

3.)回应的地方在哪里,以及要检查什么?

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

4.)退出怎么办?

  • SAML 2.0还为Single LogOut(SLO)定义了一个configuration文件。 这不仅会让你注销SP,还会让你注意到IdP和潜在的其他SP。 它具有与单点login(SSO)类似的请求/响应stream程,因此与设置和检查(状态码,签名等)类似。

所以简而言之 – 从零开始实施起来可能相当复杂。 最好使用经过validation的真正的库和/或像伊恩所build议的产品。 像他这样的公司已经投入了数百小时的开发时间来按照规范实施并与其他供应商进行testing互操作。

如果您只是将一个Java应用程序设置为服务提供程序,则应该考虑使用来自Oracle (作为独立程序)或ForgeRock (与OpenAM捆绑在一起)的Fedlet。 ForgeRock Fedlet有一些与Shibboleth 2.2.1作为身份提供者交互的问题,但是我觉得configuration和提供更多信息会更简单。

每个README中都有明确的说明来帮助您进行部署。 Fedletconfiguration完成并与IDP通信后,成功页面会显示将联合SSO集成到应用程序所需的所有代码。 它做了发送和接收AuthnRequests和Responses的背景工作。

Scott的回答对你所提出的问题做出了很好的回应,但是我认为,试图自行编写代码来生成SAML是重新发明的。 Fedlet的devise正是为了这个用例。