2012-10-25 15 views
8

Potrzebuję przechowywać nazwę użytkownika systemu Windows i dane uwierzytelniające, aby móc później uruchomić proces wymagający tych poświadczeń.Sprawdzanie poprawności poświadczeń użytkownika systemu Windows przy użyciu macierzystych interfejsów API języka Java

Kiedy zbieram te dane jako dane wejściowe od użytkownika, chcę sprawdzić, czy dane logowania są poprawne. Czy istnieje natywne API w Javie, które może mi pomóc zweryfikować poświadczenia systemu Windows?

Przechodziłem przez klasę LoginContext, ale wygląda na to, że może być używane tylko do celów SSO. Inną propozycją, którą otrzymałem, było rozpoczęcie procesu, który wymaga tych poświadczeń i sprawdzenia, czy działa lub nie. Ale to nie wygląda na właściwe podejście.

Proszę dać mi znać, jeśli ktoś zrobił to wcześniej lub mieć pojęcie, jak to zrobić.

Dzięki Piyush

+0

jest to zbiór domena/nazwa_użytkownika mandatów chcesz? – ChadNC

+0

Tak, otrzymam referencje od użytkownika. Muszę tylko sprawdzić, czy są poprawne. Może to być użytkownik lokalnego komputera, a także użytkownik LDAP. Bardziej niepokoi mnie lokalny użytkownik systemu, taki jak administrator. – user1774433

Odpowiedz

7

Dzięki mandatów, to znaczy rzeczywiste hasło użytkownika? Następnie możesz użyć LDAP, aby spróbować połączyć się z Active Directory Windows. Zobacz powiązane pytanie: Windows password Authentication with LDAP

Bardziej skomplikowany sposób, aby to zrobić jest użycie rodzimych połączeń Windows, być może za pośrednictwem platformy JNA: http://jna.java.net/javadoc/platform/com/sun/jna/platform/win32/package-summary.html

Jest to projekt o nazwie „wafel”, który owinięty tym bardziej przydatna biblioteki, patrz np funkcja logonUser w https://github.com/dblock/waffle/blob/master/Source/JNA/waffle-jna/src/waffle/windows/auth/impl/WindowsAuthProviderImpl.java. To prowadzi bezpośrednio do pliku win32 advapi32.dll.

Pozwoli to również na wykonywanie uwierzytelniania systemu Windows dla użytkowników lokalnych, bez domeny.

EDIT: Pełny kod roboczych od 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

Nie musi to być aktywny użytkownik katalogu. Może to być również użytkownik lokalny. na przykład administrator – user1774433

+0

Dzięki greyfairer, Jestem w stanie zweryfikować dane logowania użytkownika systemu lokalnego za pomocą JNA. Poniżej znajduje się fragment kodu, który napisałem, który działa na moje żądanie: – user1774433

+1

Nie można tego sformatować: :) '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() \t if (! Advapi32.INSTANCE.LogonUser ("Administrator", InetAddress.getLocalHost(). Gethostname(), "password", WinBase.LOGON32_LOGON_NETWORK, \t WinBase.LOGON32_PROVIDER_DEFAULT, phUser)) { \t throw new LastErrorException (Kernel32.INSTANCE.GetLastError()); \t} – user1774433

Powiązane problemy