我如何从Java与ADFS对话?

时间:2015-01-30 16:36:10

标签: java saml adfs shibboleth opensaml

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

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

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

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

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

2 个答案:

答案 0 :(得分:9)

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

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

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

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

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

您可以找到更多比较详情和注意事项in this thread

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

答案 1 :(得分:5)

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

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

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

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

关于OAuth的说明

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

相关问题