Active Directory Authentifizierung mit NICHT Domänen Computer

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von YouNoob.

    Active Directory Authentifizierung mit NICHT Domänen Computer

    Hallo zusammen,

    ich möchte für den Login in meiner Software die Windows Authentifizierung in einem Active Directory Netzwerk verwenden.
    Ich verwende folgenden Code dafür (Funktioniert soweit auch):

    VB.NET-Quellcode

    1. Private Declare Auto Function LogonUser Lib "advapi32.dll" (
    2. ByVal lpszUsername As String,
    3. ByVal lpszDomain As String,
    4. ByVal lpszPassword As String,
    5. ByVal dwLogonType As LogonType,
    6. ByVal dwLogonProvider As Integer,
    7. ByRef phToken As IntPtr) As Integer
    8. Private Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal hObject As IntPtr) As Boolean
    9. Public Enum LogonType As Integer
    10. LOGON32_LOGON_INTERACTIVE = 2
    11. LOGON32_LOGON_NETWORK = 3
    12. LOGON32_LOGON_BATCH = 4
    13. LOGON32_LOGON_SERVICE = 5
    14. LOGON32_LOGON_INTERACTIVE_TOKEN_OR_PASSWORD = 6
    15. LOGON32_LOGON_UNLOCK = 7
    16. LOGON32_LOGON_NETWORK_CLEARTEXT = 8
    17. LOGON32_LOGON_NEW_CREDENTIALS = 9
    18. End Enum
    19. ''' <summary>
    20. ''' Diese Funktion prüft ob ein angegebenes Windows Passwort und Benutzername richtig sind.
    21. ''' </summary>
    22. ''' <param name="Username">Der Windows Benutzername</param>
    23. ''' <param name="Password">Das Windows Passwort</param>
    24. ''' <param name="Domain">Optionale Domain</param>
    25. Public Function IsNTPasswordValid(ByVal Username As String, ByVal Password As String, Optional ByVal Domain As String = "") As Boolean
    26. Dim Token As New IntPtr
    27. LogonUser(Username, Domain, Password, LogonType.LOGON32_LOGON_INTERACTIVE, 0, Token)
    28. CloseHandle(Token)
    29. If Token.ToInt32 <> 0 Then Return True
    30. Return False
    31. End Function
    32. Private Sub B_login_Click(sender As Object, e As EventArgs) Handles B_login.Click
    33. If IsNTPasswordValid(tbxUsername.Text, tbxPassword.Text, "tbxDomain.Text") Then
    34. 'Weiter
    35. Else
    36. 'Zugangsdaten falsch
    37. End If
    38. End Sub​


    Wenn ich nun aber einen Computer verwende, der nicht in der Domäne jedoch im selben Netzwerk ist, funktioniert das ganze nicht. Meine Frage: Welche Möglichkeiten habe ich um diese Problematik zu umgehen. Meiner Meinung nach müsste das ganze funktionieren, da ich z. B. auch auf einen Netzwerkpfad auf dem Server zugreifen kann und mich dort mit einem Domänen Benutzer authentifiziere auch wenn der PC nicht in der Domäne ist.
    Ich vermute es liegt am LogonType "LOGON32_LOGON_INTERACTIVE" da der Benutzer sich dann schon DC authentifiziert haben muss. Jedoch finde ich keinen Parameter der auf meine Situation passt. :(

    Ich bedanke mich vorab für eure Hilfe :)

    Gruß
    YouNoob
    The LogonUser function attempts to log a user on to the local computer. The local computer is the computer from whichLogonUser was called. You cannot use LogonUser to log on to a remote computer.

    Wenn der PC nicht in der Domäne ist, kannst du dich auch nicht mit einem Domänenuser an diesem PC anmelden.

    lG
    Das ist meine Signatur und sie wird wunderbar sein!
    Danke für deine Rückmeldung.

    Habe das ganze nun folgendermaßen gelöst:

    VB.NET-Quellcode

    1. Public Function IsUserAuthenticated(ByVal username As String, ByVal pwd As String) As Boolean
    2. Dim result As Boolean = False
    3. Dim domainControllerIP As String = "192.168.0.1"
    4. Dim domain As String = "domain"
    5. Dim _path As String = String.Format("LDAP://{0}/DC={1},DC=local", domainControllerIP, domain)
    6. Dim domainAndUsername As String = domain & "\" & username
    7. Dim entry As DirectoryEntry = New DirectoryEntry(_path, domainAndUsername, pwd)
    8. Try
    9. Dim obj As Object = entry.NativeObject
    10. Dim search As DirectorySearcher = New DirectorySearcher(entry)
    11. search.Filter = "(SAMAccountName=" & username & ")"
    12. search.PropertiesToLoad.Add("cn")
    13. Dim result1 As SearchResult = search.FindOne()
    14. If result1 IsNot Nothing Then
    15. result = True
    16. End If
    17. Catch ex As Exception
    18. 'result = False
    19. End Try
    20. Return result
    21. End Function