首页 文章

如何成为SAML服务提供商

提问于
浏览
76

大家早上好,

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

所以这就是我如何想象用户登录的工作流程 .

让我们将客户的SAML服务器定义为https://their.samlserver.com . 因此,用户访问我们的Web应用程序以获取资源's protected. Let' s表示URL为http://my.app.com/something .

所以,如果我是正确的, my.app.com 是SAML定义的 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>

So my first couple questions.

假设 ID 值是多少?

为什么我可以宣称自己为 Issuer

身份提供商是否了解我?也许这就是 Circle of trust

我一直在 OpenAM 看到 . 如果它确实了解我,它如何了解我以及它需要知道什么?

因此,在用户转发该页面后,它们将被带到IDP https://their.samlserver.com提供的页面 . 他们在该页面上进行身份验证,IDP可以验证身份验证并查找用户 . 身份验证成功后,IDP会发回 <samlp:Response> 定义的here .

A few more questions.

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

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

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

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

最后,在我的阅读中有几个主题被抛出,我不确定它们如何适应这个工作流程 . 它们是 Circle of trustTokensArtifacts .

感谢大家的帮助 . 我在过去的几天里发现了很多信息,而且我可能会在玩完一段时间之后把它们拼凑起来 . 但我还没有找到一个直截了当的“这是帖子”工作流程文章 . 也许那是因为我对这是如何工作的错了 . 也许是因为这不是那么受欢迎 . 但我真的想确保我得到了工作流程,所以我没有错过与用户身份验证同等重要的关键步骤 .

2 回答

  • 45

    回答您的具体问题:

    1.) What is the "ID" value supposed to be?

    • 这应该是SAML请求的唯一标识符 . SAML 2.0规范指出它是如何实现特定于实现的,但提出以下建议:

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

    2.) How does the IdP know about you?

    • 您的SP需要在IdP注册 . 为此,SAML规范定义了"SAML Metadata"的格式,它告诉IdP您的SAML接收器在哪里,您的证书是什么,您交换的属性等等.OpenAM可能规定了配置可信SP的一些最低要求 . 每种产品都有所不同 .

    3.) Where's the Response go, and what to check?

    • 响应将转到您通常使用IdP进行初始设置从您的SP交换的SAML元数据中定义的断言消费者服务(ACS)URL . 当您收到SAML响应时,您需要检查很多内容 - 但最重要的是,SAML状态代码应为"success",inResponseTo ID 's should match the request'已发送,并且您必须验证断言上的数字签名 . 为此,您需要_2680855的公共验证证书,您可能也想要进行撤销检查 .

    4.) What about Logout?

    • SAML 2.0还定义了Single LogOut(SLO)的配置文件 . 这不仅会让您退出SP,而且还会使IdP和其他任何SP Build 会话 . 它具有与单点登录(SSO)类似的请求/响应流程,因此具有类似的设置和检查功能(状态代码,签名等) .

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

  • 2

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

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

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

相关问题