2010-04-27 10 views
5

Ich habe eine neue Tabelle, die alte Passwörter halten, muss ich überprüfen, ob es eine Übereinstimmung gibt.ASP.NET Mitgliedschaft ChangePassword-Steuerelement - muss nach dem vorherigen Passwort

Wenn es eine Übereinstimmung gibt, brauche ich das ChangePassword-Steuerelement, um das Kennwort NICHT zu ändern. Ich muss dem Benutzer mitteilen, dass dieses Passwort verwendet wurde, und ein neues erstellen.

Ich kann nicht scheinen, die Kontrolle vom Ändern des Kennwortes unterbrechen zu können. Vielleicht verwende ich das falsche Ereignis.

Hier ist ein Stück meines Codes, oder wie ich wünschte, es würde funktionieren. Ich schätze all Ihre Hilfe.

protected void ChangePassword1_ChangedPassword(object sender, EventArgs e) 
    { 
     MembershipUser user = Membership.GetUser(); 
     string usrName = ""; 
     if (user != null) 
     { 
      string connStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString; 
      SqlConnection mySqlConnection = new SqlConnection(connStr); 
      SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); 
      mySqlCommand.CommandText = "Select UserName from OldPasswords where UserName = 'test'"; 
      mySqlConnection.Open(); 
      SqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader(CommandBehavior.Default); 
      while (mySqlDataReader.Read()) 
      { 
       usrName = mySqlDataReader["UserName"].ToString(); 
       if (usrName == user.ToString()) 
       { 

        Label1.Text = "Match"; 
       } 
       else 
       { 
        Label1.Text = "NO Match!"; 
       } 
      } 
+1

Ich bin mir nicht sicher, was Sie hier tun möchten. Sie sprechen davon, dass Sie alte Kennwörter verifizieren möchten, aber Ihre SQL-Anweisung ruft Benutzernamen ab und überprüft nie die Kennwörter. Wie verifizierst du das Passwort selbst? – cortijon

+0

Ja, Sie haben Recht, dieser Code befindet sich auf einer anderen Seite, ich habe gerade eine Testseite erstellt, Entschuldigung wegen der Verwirrung. Ich hatte gerade Schwierigkeiten, den Prozess selbst zu unterbrechen. Vielen Dank für Ihre Eingabe. – Steve

+0

Irgendwelche Fortschritte auf diesem? –

Antwort

6

Sie überschreiben die falsche Methode, Steve. Sie möchten den kündbaren Code ChangingPassword überschreiben.

Try this:

protected void ChangePassword1_ChangingPassword(object sender, LoginCancelEventArgs e) 
{ 
    // do your lookup here, 
    bool passwordHasBeenPreviouslyUsed = true; 

    if (passwordHasBeenPreviouslyUsed) 
    { 
     e.Cancel = true; 
     // notify of error 
     return; 
    } 

} 

Und wie pro vorherigen Q/A-Sitzungen, sollten Sie nie üBERHAUPT HAUPT speichern das Kennwort eines Benutzers . Gehen Sie zur Mitgliedschaftstabelle und holen Sie sich das Salz und verwenden Sie dieses, um das eingehende Passwort zu hashen, um es mit den bereits in der Suchtabelle gespeicherten Werten zu vergleichen.

Viel Glück.

(1) - Wie haltbar wäre Ihre Position, wenn der CEO herausfindet, dass sein Passwort in einem auswertbaren Format gespeichert wurde? Den schwarzen Magiern, die wir sind, wird Vertrauen entgegengebracht, und dieses Vertrauen birgt seine eigenen Risiken. Sei dir ihrer bewusst. ;-)

EDIT:

Ein Arbeitsbeispiel:

ChangePassword.aspx

<%@ Page Language="C#" %> 
<%@ Import Namespace="System.Diagnostics"%> 

<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void ChangePassword1_ChangingPassword(object sender, LoginCancelEventArgs e) 
    { 
     // works for me! 
     Debugger.Break(); 
    } 
</script> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:ChangePassword ID="ChangePassword1" runat="server" OnChangingPassword="ChangePassword1_ChangingPassword"> 
     </asp:ChangePassword> 
    </div> 
    </form> 
</body> 
</html> 

aktualisieren: Sie können auch in einfach definieren einen Handler in einem interessiert sein höherer Bereich, der alle Passwortaktivitäten überwacht:

Betrachten Sie diese

public void SetupPasswordActionHook() 
{ 

    //Occurs when a user is created, a password is changed, or a password is reset. 
    Membership.ValidatingPassword += Membership_ValidatingPassword; 
} 

void Membership_ValidatingPassword(object sender, ValidatePasswordEventArgs e) 
{ 

    // Gets a value that indicates whether the System.Web.Security.MembershipProvider.ValidatingPassword event is being raised during a 
    // call to the System.Web.Security.MembershipProvider.CreateUser() method. 

    // true if the System.Web.Security.MembershipProvider.ValidatingPassword event is being raised during a call to the 
    // System.Web.Security.MembershipProvider.CreateUser() method; otherwise, false. 
    bool isNewUser = e.IsNewUser; 

    // Gets the password for the current create-user, change-password, or reset-password action. 

    // The password for the current create-user, change-password, or reset-password action. 
    string password = e.Password; 

    // Gets the name of the membership user for the current create-user, change-password, or reset-password action. 

    // The name of the membership user for the current create-user, change-password, or reset-password action. 
    string username = e.UserName; 

    // Gets or sets a value that indicates whether the current create-user, change-password, or reset-password action will be canceled. 

    // true if the current create-user, change-password, or reset-password action will be canceled; otherwise, false. The default is false. 
    e.Cancel = true; 

    // Gets or sets an exception that describes the reason for the password-validation failure. 

    // An System.Exception that describes the reason for the password-validation failure. 
    e.FailureInformation = new Exception("This is why I failed your password"); 

} 
+0

Vielen Dank für Ihr Codebeispiel, ich werde das ausprobieren. Ich speichere natürlich NICHT alles in klarem Format, das Passwort ist in beiden Tabellen aufgeteilt und ich speichere das Salz damit. Ich habe das Passwort, das der Benutzer eingibt und vergleiche es mit dem, das ich in meiner "OldPassword" -Tabelle habe. Nochmals vielen Dank für Ihre Hilfe. – Steve

+0

@Sky - Weißt du, warum das in meinem Code nicht ausgelöst würde? – Steve

+0

@Steve - (setzt psychischen Hut auf) hmm .... Ich habe das Gefühl, dass Sie vielleicht nicht in der Steuerung angegeben haben, dass ChangingPassword eventHandler ChangePassword1_ChangingPassword ist. (psychischen Hut abziehend) Wie habe ich gemacht? ;-) –

Verwandte Themen