Linux

使用 Active Directory 的 Java 應用程序身份驗證

  • July 31, 2020

我正在開發一個第三方 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

也有使用 ldap over SSL 的規定,但目前我們沒有使用它。但是,如果我們確實使用 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) 

有人可以幫忙解決這個問題嗎?或者可能指向正確的方向?任何幫助將不勝感激。

謝謝你。

我在您的配置中看到了一些潛在的問題。

ldapContextSource.userDn 和 .password 應該是 AD 中帳戶的憑據,該帳戶有權讀取將登錄到應用程序的所有使用者帳戶。他們希望 .userDn 值實際上是一個 LDAP DN 字元串(類似於 .searchBase 的字元串),但對於 Active Directory,您可以使用 userPrincipalName (UPN) 屬性(通常是 username@example.net)。因此,錯誤的憑據錯誤可能只是因為您沒有使用任何內容來限定使用者名。我總是更喜歡將 UPN 用於 LDAP 集成,因為帳戶可以在 AD 中移動,而應用程序並不關心(與會更改的 DN 不同)。

假設得到解決,您的 .filter 值也可能是一個問題。雖然 uid 屬性確實存在於 Active Directory 中,但預設情況下通常不會填充它。如果您希望使用者僅使用其使用者名登錄,則應將其更改為 sAMAccountName。

當您開始啟用基於 SSL 的 LDAP (LDAPS) 時,您需要在您的域控制器上擁有 Java 應用程序信任的 TLS 證書。如果它是自簽名證書,則該證書將需要進入其文件引用的密鑰庫。如果它是從公共或內部 PKI 基礎結構生成的證書,則應改為為該基礎結構添加 CA 證書鏈。您還需要將 LDAP 伺服器 URI 更改為 ldap s :// 和埠 636(或 3269 用於全域目錄搜尋)。

引用自:https://serverfault.com/questions/725197