Feedback

LDAP – Authentifizieren eines Benutzers in der Domäne

Sprache: VB

Kann ein Benutzer in der Domäne authentifiziert werden? UPDATE: Nun wird das Passwort dem Active Directory verschlüsselt übermittelt. Danke an Volker Steitz für den Hinweiß.
Imports System.Security
Imports System.DirectoryServices
Imports System.DirectoryServices.ActiveDirectory

Public Shared Function Authenticate(ByVal domain As String, ByVal username As String, ByVal password As String) As Boolean 
    Dim pwd As New SecureString() 
    Dim bAuth As Boolean = False 
    Dim entry As DirectoryEntry = Nothing 
    
    'Durchlaufe das Passwort und hänge es dem SecureString an 
    For Each c As Char In password 
        pwd.AppendChar(c) 
    Next 
    
    'Bewirkt, dass das Passwort nicht mehr verändert werden kann 
    pwd.MakeReadOnly() 
    
    'Passwort wird einem Pointer übergeben, damit dieser später "entschlüsselt" werden kann 
    Dim pPwd As IntPtr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(pwd) 
    
    Try 
        entry = New DirectoryEntry(String.Concat("LDAP://", domain), username, System.Runtime.InteropServices.Marshal.PtrToStringBSTR(pPwd)) 
        Dim nativeObject As Object = entry.NativeObject 
        bAuth = True 
    Catch ex As Exception 
        bAuth = False 
    Finally 
        entry.Close() 
        entry.Dispose() 
    End Try 
    Return bAuth 
End Function 
Imports System.Security
Imports System.DirectoryServices
Imports System.DirectoryServices.ActiveDirectory

Public Shared Function Authenticate(ByVal domain As String, ByVal username As String, ByVal password As String) As Boolean 
    Dim pwd As New SecureString() 
    Dim bAuth As Boolean = False 
    Dim entry As DirectoryEntry = Nothing 
    
    'Durchlaufe das Passwort und hänge es dem SecureString an 
    For Each c As Char In password 
        pwd.AppendChar(c) 
    Next 
    
    'Bewirkt, dass das Passwort nicht mehr verändert werden kann 
    pwd.MakeReadOnly() 
    
    'Passwort wird einem Pointer übergeben, damit dieser später "entschlüsselt" werden kann 
    Dim pPwd As IntPtr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(pwd) 
    
    Try 
        entry = New DirectoryEntry(String.Concat("LDAP://", domain), username, System.Runtime.InteropServices.Marshal.PtrToStringBSTR(pPwd)) 
        Dim nativeObject As Object = entry.NativeObject 
        bAuth = True 
    Catch ex As Exception 
        bAuth = False 
    Finally 
        entry.Close() 
        entry.Dispose() 
    End Try 
    Return bAuth 
End Function 

9 Kommentare

  1. Das halt ich für recht kritisch. Die Angaben wie Password und Username werden unverschlüsselt gegen ein Active Directory geschickt. Null Problem das abzufangen.
    Gut wär´s gewesen, wenn du mit den entsprechenden Secure Strings gearbeitet hättest.

  2. Hallo Herr Steitz,

    ich kann das selbstverständlich auch mit SecureStrings machen, das Problem was ich jetzt persönlich sehe ist, dass das Passwort der SecureString Funktion als Klartext übergeben wird. Ich könnte es fest im Code oder eine Textbox übergeben, in beiden Fällen kann man es auslesen. Oder geht es Ihnen hauptsächlich darum das ich das Active Directory unverschlüsselt anspreche?

  3. Hallo Herr Gross,

    es ist richtig, dass die Funktion das Kennwort immer noch im Klartext erhält, aber die authentifizierung gegen das LDAP erfolgt dann verschlüsselt. Der Server – der Verzeichnisdienst – befindet sich unhter umständen irgendwo im Campus oder im Metropolitan Netz oder sogar durchs WWW.

    Gruß

    Volker Steitz

  4. Hallo, ich bin zimlich neu in VB, habe mal eine Frage dazu? wie rufe ich dann Public Shared Function auf, bzw. wie frage ich das ab. Ich muss mich als Domain Admin anmelden können.

  5. Bräuchte dringend Hilfe. Sorry aber ich bin neu in VB.NET
    Ich bekomme es einfach nicht hin mich an der AD zu Authentifizieren.
    Dim RootDSE As New DirectoryEntry(„LDAP://RootDSE“)
    RootDSE.Username = „domänen Admin“
    RootDSE.Password = „Passwort“

    Dim DomainDN As String = RootDSE.Properties(„DefaultNamingContext“).Value
    Dim ADsearch As New DirectorySearcher(„LDAP://“ & DomainDN)

    Try

    ADsearch.Filter = („(&(objectClass=computer)(name=“ & MachineName.Text & „))“)

    Dim ADresult As SearchResult = ADsearch.FindOne
    Dim ADpath As String = ADresult.Path

    Dim BTsearch As New DirectorySearcher()
    BTsearch.SearchRoot = New DirectoryEntry(ADpath)
    BTsearch.Filter = „(&(objectClass=msFVE-RecoveryInformation))“

    Dim BitLockers As SearchResultCollection = BTsearch.FindAll()

    Dim Item As SearchResult

    Dim longTempstring As String = „“

    For Each Item In BitLockers
    If Item.Properties.Contains(„msFVE-RecoveryGuid“) Then

    Dim tempstring As String = bitread(Item.Properties(„msFVE-RecoveryGuid“)(0))

    longTempstring = longTempstring & tempstring & vbNewLine
    ListBox2.Items.Add(bitread(Item.Properties(„msFVE-RecoveryGuid“)(0)))

    End If
    If Item.Properties.Contains(„msFVE-RecoveryPassword“) Then

    ListBox1.Items.Add(Item.Properties(„msFVE-RecoveryPassword“)(0))

    End If
    Next
    ‚MsgBox(longTempstring)
    Catch ex As Exception
    MsgBox(ex.Message)
    End Try

    Danke für Eure Hilfe.