使用 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 值也可能是個問題。雖然 Active Directory 中確實存在 uid 屬性,但預設通常不會填入該屬性。如果您希望使用者僅使用使用者名稱登錄,則應將其變更為 sAMAccountName。

當您著手啟用 LDAP over SSL (LDAPS) 時,您需要在 Java 應用程式信任的網域控制站上擁有 TLS 憑證。如果它是自簽名證書,則該證書需要進入其文件引用的金鑰庫。如果它是從公共或內部 PKI 基礎設施產生的證書,您應該為該基礎設施添加 CA 證書鏈。您還需要將 LDAP 伺服器 URI 變更為 ldaps:// 和連接埠 636(或用於全域目錄搜尋的 3269)。

相關內容