我如何从Java与ADFS对话?

我们有一个在Caucho Resin上运行的网站。 该站点的绝大多数是JSP / Java。 我们在网站上有自己的自定义身份validation,这意味着我们没有使用任何第三方身份validation框架。 我们托管网站,而不是我们的客户。

我们的大客户希望让他们的用户使用他们的活动目录凭据登录我们的站点。 为此,我假设我将使用SAML与ADFS交谈,如果错误,请纠正我。

所以我的问题是我如何用Java做到这一点? 据我所知,OpenSAML听起来并没有做任何事情,如果我想要更多,那么我需要使用Shibboleth。 还有其他选择吗? 如果我想要的是用户能够登录,我最好的选择是什么?

任何信息都会有帮助。 谢谢。

编辑:我刚刚发现另一种选择是OAuth。 优点? 缺点?

您的应用程序需要直接(从您的代码)或间接(例如通过反向代理,应用程序服务器上的SAML SP支持,……)充当SAML SP。

对于直接选项 (需要对您的应用程序进行更多修改),您可以:

  • 自己编写SAML SP代码(最有可能使用OpenSAML ,您可以在现有产品的源代码中找到示例)
  • 使用现成的产品集成到您的应用程序中,例如Spring SAML或OpenAM Fedlet

对于间接选项 (需要对应用程序进行较少的修改),您可以:

  • 在Apache反向代理上使用Shibboleth SAML SP插件 (如果使用的话)
  • 将SAML SP部署为容器上的另一个应用程序(例如Spring SAML或OpenAM)并使其与您的应用程序通信 – 因此SAML SP使用ADFS执行身份validation并将其传递给您的应用程序,例如通过共享cookie或自定义令牌

您可以在此主题中找到更多比较详细信息和注意事项。

ADFS 3应该支持OAuth授权服务器,它可能是一种更简单的集成方式,请参见此处和此处 。 使用OAuth实现身份validation通常比SAML容易得多,没有相关的缺点。

Caucho提供的Resin Authenticators对联邦没有帮助。 相反,您需要添加一个ServletFilter来查找未经身份validation的用户。 当找到一个时,您应该将它们引导到登录页面。 在此,您应该询问用户是否要直接登录您的站点或联合到另一个组织。 (这可以通过显示用户名/密码表单+受信任的第三方徽标来完成。)在前者,直接登录案例中,使用Resin身份validation器检查您的本地用户仓库,或者您现在正在执行此操作。 对于联合案例,请使用SAML。

联合将首先向可信伙伴(ADFS服务器)发送身份validation请求。 这是一个小的XML文档,打包成一个表单,每个请求需要更改一些内容(例如,创建时间)。 这可以使用String.format完成 – 没有什么复杂的。 将此身份validation请求发送到用户选择的组织的SAML服务器(即ADFS)。 他们将登录并将身份validation响应发送到您需要创建的某些“断言消费者服务”。

ACS只是一个接收SAML身份validation响应的端点。 这需要是一个未经身份validation的端点,它将解析并validation来自ADFS的回复。 使用OpenSAML执行此操作。 您需要做很多事情才能确保它有效。 例如,您必须validation断言的数字签名。 您还需要检查发布时间,它不会在将来。 通过检查确认数据,受众和收件人中的目的地,validation断言是否适合您。 等等。

如果这超出了您想要编码的范围,请检查开源或商业SAML服务器。 它需要作为SP运行,并且应该在Resin中运行以保持简单。 一个卑鄙和精益的候选人是Asimba 。 ( 我工作的公司是这个项目的维护者。)你可以将它部署到Resin中,它将处理请求和回复。

关于OAuth的说明

您在这里考虑的是联合(或Web单点登录)。 OAuth不适合联合。 它是一个旨在进行委托授权的协议。 OpenID Foundation已扩展OAuth 2以支持OAuth的OpenID Connect配置文件中的联合。 ADFS不支持此联合协议,仅限于WS-Federation和SAML。 因此,如果您的合作伙伴将使用ADFS,则不应该考虑OAuth。

Interesting Posts