2

Ich habe eine Funktion, die es einem Domänenbenutzer ermöglicht, mit ihren LDAP-An-Meldeinformation authentifiziert werden. Es funktioniert jedoch lange, da ich ein bekanntes Passwort als eine rohe Zeichenfolge fest codiere ... was natürlich ein Nein ist. Ich möchte einen Zeichenfolgenwert übergeben, der von einer TextBox empfangen wurde, die ich eingerichtet habe. Hier ist die Funktion:Übergeben Zeichenfolge Variable in Nework Credential Constructor für Kennwort Argument

public static bool fnValLDAPCreds() 
    { 
     bool validation;         

     try 
     {     

      LdapConnection ADConn = new LdapConnection(new LdapDirectoryIdentifier((string)null, false, false)); 
      NetworkCredential NetCred = new NetworkCredential(Environment.UserName, "Password123", Environment.UserDomainName); 

      ADConn.Credential = NetCred; 
      ADConn.AuthType = AuthType.Negotiate; 
      // the user's authenticated here; creds used to login on the domain controller. 

      ADConn.Bind(NetCred); 
      validation = true; 
      MessageBox.Show("You were successfully authenticated against AD using LDAP!"); 
     } 

     catch (LdapException) 
     { 
      validation = false; 
      MessageBox.Show("Your login was unsuccesful. Try a different set of credentials."); 
     } 

     return validation; 
    } 

Was ich versucht habe, von meinem TextBox in einem Wert war Ersatz zu tun, aber da es in der static bool liegt habe ich nicht erfolgreich mit der Herstellung keine externen Verweise auf eine Kontrolle in der aktueller Kontext. Ich rufe diese Funktion im Button-Handler auf, um sie auszulösen. Wie kann ich in eine string DomPassWord Variable tauschen, die ihren Wert von der Textbox erhält, die ich eingerichtet habe, um sie zu erhalten?

NetworkCredential NetCred = new NetworkCredential(Environment.UserName, DomPassWord, Environment.UserDomainName); ist, was ich anstrebe, wie ich sicher ein Kennwort in der Domäne ohne harte Kodierung, mit etwas wie DomPassWord = txtUserPW.Text übereinstimmen kann. Versuchte die SecureString Route, war aber in dieser Hinsicht auch nicht erfolgreich. Irgendwelche Ideen?

+2

Warum fügen Sie der Methode fnValLDAPCreds kein 'string password' Argument hinzu, ersetzen' 'Password123' 'durch' password' und nennen es wie 'fnValLDAPCreds (myTextBox.Text)'? Oder Ihre Frage ist nicht sehr klar –

+0

Ich habe Probleme, das größere Bild zu visualisieren. Machst du das, um sicherzustellen, dass der Benutzer, der als "Bob" angemeldet ist, tatsächlich Bob ist, indem er ihn dazu bringt, sein Passwort erneut einzugeben? Oder verwenden Sie es als Argument anderswo, um eine Berechtigung zu vervollständigen? – Kevin

Antwort

5

Sie können auf Textfelder innerhalb einer statischen Methode nicht zugreifen, da sie keine statischen Felder sind (zumindest sieht es so aus, wie Sie es geschrieben haben).

Aber Sie können Ihre Argumente einfach an Ihre Methode übergeben. Ändern Sie ihn auf etwas wie folgt aus:

public void ButtonClick(object sender, EventArgs args) 
{ 
    // bool valid = fnValLDAPCreds(Environment.UserName, "Password123", Environment.UserDomainName); 
    bool valid = fnValLDAPCreds(txtUserName.Text, txtUserPW.Text, Environment.UserDomainName); 
} 

public static bool fnValLDAPCreds(string username, string password, string domain) 
{ 
    try 
    { 
     LdapConnection ADConn = new LdapConnection(new LdapDirectoryIdentifier((string)null, false, false)); 
     NetworkCredential NetCred = new NetworkCredential(username, password, domain); 

     ADConn.Credential = NetCred; 
     ADConn.AuthType = AuthType.Negotiate; 
     // the user's authenticated here; creds used to login on the domain controller. 

     ADConn.Bind(NetCred); 
     MessageBox.Show("You were successfully authenticated against AD using LDAP!"); 
     return true; 
    } 
    catch (LdapException) 
    { 
     MessageBox.Show("Your login was unsuccesful. Try a different set of credentials."); 
     return false; 
    } 
} 
+0

Vielen Dank an alle mit guten Einblicken, und ich wünschte, ich könnte das Kopfgeld teilen, aber das war genau richtig. Das Ziel war wie erwähnt ... stelle sicher, dass Charlie wirklich "Charlie" ist ... indem Charlie derjenige ist, der seine Domain-ID UND das Domain-Passwort kennt. – DesignerMind

+0

Um weiter zu erklären, was ich nicht will, ist für NTLM durch die Crews basierend einen korrekten Benutzernamen zu übergeben. Wenn sich Charlie zu einer lächerlichen Passwort-Zeichenfolge ändert, muss er diese Zeichenfolge eingeben, um authentifiziert zu werden. Ich weiß an dieser Stelle kann ich das Passwort über 'SecureString' verschlüsseln und sogar' UseSystemPasswordChar' auf der Box setzen, war aber bei der Übergabe der Zeichenfolge unscharf um zu funktionieren! – DesignerMind

0

Kinda tangential, aber haben Sie sich Gedanken über AuthType.Ntlm? Wenn Sie nur dafür sorgen, dass Charlie Charlie ist, indem Sie ihn dazu zwingen, sein Passwort einzugeben? Dann bist du auf dem richtigen Weg. Aber wenn Sie versuchen, eine Verbindung zu AD mithilfe der aktuellen Benutzeranmeldeinformationen herzustellen, um AD selbst zu erreichen? Dann könnten Sie einen Blick auf

ADConn.AuthType = AuthType.Ntlm; 

nehmen wollen ... und lassen Fenster handhaben dies für Sie (keine Notwendigkeit, den Benutzertyp in einem Passwort haben überhaupt -. Es ihre aktuellen Windows-Anmeldeinformationen verwenden werden)

Verwandte Themen