使用 Active Directory 进行 Java 应用程序身份验证

使用 Active Directory 进行 Java 应用程序身份验证

我正在开发第三方 Java 应用程序,需要使用 Active Directory 对其用户进行身份验证。

此应用程序托管在 RHEL 6.5 上,并使用 LDAP 通过 Windows Active Directory 进行身份验证。AD 服务器已设置完毕,并且可与应用程序的早期版本(已配置为启用集成)配合使用。

对于较新的版本,供应商已经制定了一些步骤来修改/配置应用程序文件以连接 AD 服务器,预计这些步骤将帮助我们进行身份验证。

该应用程序的一个组件是 CAS,目前配置为使用数据库作为其身份验证处理程序。当我们输入凭证 - 用户名:abcd,密码:samplepswd 时,我们能够成功登录。

由于业务需求是使用 LDAP 对 Active Directory 进行身份验证,因此我们必须修改 CAS 属性文件。根据产品供应商的说明,我们已将以下属性更改为使用 ldap -

authenticationHandler.type=ldap
ldapSSLConfig.enabled=false
ldapContextSource.url=ldap://sample.ADserver.example.net:389
ldapContextSource.userDn=abcd
ldapContextSource.password=samplepswd
ldapAuthenticationHandler.filter=uid=%u
ldapAuthenticationHandler.searchBase=OU=DEF,OU=PQR,OU=XYZ,DC=ADserver,DC=example,DC=net

我们还需要在 casAuthConfig xml 文件中对以下属性进行更改(因为不支持匿名搜索):1. anonymousReadOnly,值设置为 false 2. java.naming.security.authentication,值设置为 simple

也有规定使用 SSL 上的 ldap,但目前我们没有使用。但是,如果我们使用 SSL,则必须对以下属性进行其他更改:

ldapSSLConfig.enabled=true
ldapSSLConfig.trustStorePath=/home/dir1/subdir1/subdir2/keystorename.keystore
ldapSSLConfig.trustStoreType=jceks

这些是我们(客户端)端所做的唯一配置更改;事实上,也是所做的唯一更改。除了另一个用户之外,服务器(AD 服务器)上没有添加/修改任何内容,但这对现有设置没有影响。

重新启动 cas 以反映更改后,我们遇到了凭据错误,尽管输入的值是正确的:

2015-09-16 12:12:30,558 INFO [com.pqr.cas.authentication.support.DelegatingAuthenticationHandler] - Authenticating credential using handler 
com.pqr.cas.adaptors.ldappwd.BindLdapAuthenticationHandler 
2015-09-16 12:12:30,558 DEBUG [com.pqr.cas.authentication.support.DelegatingAuthenticationHandler] - credentials.getUsername() = abcd
2015-09-16 12:12:30,672 INFO [com.pqr.cas.adaptors.ldappwd.BindLdapAuthenticationHandler] - Search for cn=abcd returned 0 results. 
2015-09-16 12:12:30,672 INFO [org.jasig.cas.authentication.AuthenticationManagerImpl] - AuthenticationHandler: 

com.pqr.cas.authentication.support.DelegatingAuthenticationHandler failed to authenticate the user which provided the following credentials: 

[username: abcd] 
2015-09-16 12:12:30,676 ERROR [org.jasig.cas.integration.restlet.TicketResource] - error.authentication.credentials.bad 
org.jasig.cas.ticket.TicketCreationException: error.authentication.credentials.bad 
at org.jasig.cas.CentralAuthenticationServiceImpl.createTicketGrantingTicket_aroundBody10(CentralAuthenticationServiceImpl.java:423) 

有人能帮忙解决这个问题吗?或者能指出正确的方向吗?任何帮助都将不胜感激。

谢谢。

答案1

我发现您的配置中存在一些潜在问题。

ldapContextSource.userDn 和 .password 应为 AD 中有权读取所有登录应用程序的用户帐户的帐户凭据。他们希望 .userDn 值实际上是 LDAP DN 字符串(类似于 .searchBase 的值),但对于 Active Directory,您可以改用 userPrincipalName (UPN) 属性(通常这是[电子邮件保护])。因此,不良凭证错误可能只是因为您没有使用任何内容来限定用户名。我总是更喜欢使用 UPN 进行 LDAP 集成,因为帐户可以在 AD 内移动,而应用程序并不关心(与会更改的 DN 不同)。

假设解决了这个问题,您的 .filter 值也可能会出现问题。虽然 uid 属性确实存在于 Active Directory 中,但默认情况下通常不会填充它。如果您希望用户仅使用其用户名登录,则应将其更改为 sAMAccountName。

当您开始启用 LDAP over SSL (LDAPS) 时,您需要在域控制器上拥有 Java 应用程序信任的 TLS 证书。如果是自签名证书,则该证书需要进入其文档引用的密钥库。如果是从公共或内部 PKI 基础架构生成的证书,则应该添加该基础架构的 CA 证书链。您还需要将 LDAP 服务器 URI 更改为 ldaps:// 和端口 636(或 3269 用于全局目录搜索)。

相关内容