2012-10-25 51 views
8

我需要存儲Windows用戶名和憑據,以便稍後運行某些需要這些憑據的進程。通過本地Java API驗證Windows用戶憑證

當我收集這些來自用戶的輸入時,我想驗證憑據是否正確。 Java中是否有本地API,可以幫助我驗證Windows系統證書?

我正在通過LoginContext類,但看起來它只能用於SSO目的。 我收到的另一個建議是嘗試啓動一個需要這些憑據的進程,看它是否有效或失敗。但是這看起來並不合適。

請讓我知道是否有人以前做過這個或有任何想法如何完成它。

感謝, 的Piyush

+0

全部工作的代碼,這是一個域/用戶名設置要憑據? – ChadNC

+0

是的,我會從用戶那裏獲得憑據。我只需要驗證它們是否正確。它可以是本地機器用戶以及LDAP用戶。我更關心像管理員這樣的本地系統用戶。 – user1774433

回答

7

通過憑證,你指的是用戶的實際密碼?然後,您可以使用LDAP嘗試連接到Windows Active Directory。請參閱相關的問題:Windows password Authentication with LDAP

更加詳盡地做,這是使用原生Windows調用,也許通過JNA平臺:http://jna.java.net/javadoc/platform/com/sun/jna/platform/win32/package-summary.html

有一個叫「華夫餅乾」,在一個更加有用的庫包裝這一項目,見例如登錄用戶功能https://github.com/dblock/waffle/blob/master/Source/JNA/waffle-jna/src/waffle/windows/auth/impl/WindowsAuthProviderImpl.java。這直接談到win32 advapi32.dll。

這也將允許您爲本地用戶執行Windows身份驗證,無需域名。

編輯:從OP

import com.sun.jna.platform.win32.Advapi32; 
import com.sun.jna.platform.win32.Kernel32; 
import com.sun.jna.platform.win32.WinBase; 
import com.sun.jna.platform.win32.WinNT.HANDLEByReference; 

HANDLEByReference phUser = new HANDLEByReference() 
if(! Advapi32.INSTANCE.LogonUser("administrator", InetAddress.getLocalHost().getHostName(), 
    "password", WinBase.LOGON32_LOGON_NETWORK, WinBase.LOGON32_PROVIDER_DEFAULT, phUser)) 
{ 
    throw new LastErrorException(Kernel32.INSTANCE.GetLastError()); 
} 
+0

它不一定是活動目錄用戶。它也可以是本地用戶。例如管理員 – user1774433

+0

感謝greyfairer, 我能夠使用JNA驗證本地系統用戶憑證。 以下是我寫的適用於我的要求的代碼片段: – user1774433

+1

無法格式化爲::) 'import com.sun.jna.platform.win32.Advapi32; import com.sun.jna.platform.win32.Kernel32; import com.sun.jna.platform.win32.WinBase; import com.sun.jna.platform.win32.WinNT.HANDLEByReference; HANDLEByReference phUser =新HANDLEByReference() \t如果(!Advapi32.INSTANCE.LogonUser( 「管理員」,InetAddress.getLocalHost()。的gethostname(), 「密碼」,WinBase.LOGON32_LOGON_NETWORK,\t WinBase.LOGON32_PROVIDER_DEFAULT,phUser )){ \t throw new LastErrorException(Kernel32.INSTANCE.GetLastError()); \t}' – user1774433