2010-04-27 66 views
5

我有一個新的表保存舊密碼,我需要檢查是否有匹配。ASP.NET成員變更密碼控制 - 需要檢查以前的密碼

如果有匹配,我需要ChangePassword控件不更改密碼。我需要告訴用戶這個密碼已經被使用並且拍攝了一個新密碼。

我似乎無法通過更改密碼來中斷控制。 也許我正在使用錯誤的事件。

這是我的一段代碼,或者我希望如何工作。 我感謝你的幫助。

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

我不知道你想在這裏做什麼。你說的是想驗證舊密碼,但是你的SQL語句檢索用戶名並且從不檢查密碼。你如何驗證密碼本身? – cortijon 2010-04-27 13:09:09

+0

是的,你是對的,那段代碼是在不同的頁面上,我真的很快把測試頁放在一起,對於混淆感到抱歉。我只是無法中斷流程本身。 感謝您的意見。 – Steve 2010-04-28 02:29:46

+0

這個有什麼進展? – 2010-05-02 13:41:30

回答

6

你壓倒了錯誤的方法,史蒂夫。您想覆蓋可取消ChangingPassword

試試這個:

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

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

} 

而且,按照前文的Q/A會話,你永遠也不會EVER存儲用戶的密碼。轉到會員表並獲取salt,並使用它對傳入的密碼進行散列,以與您存儲在查找表中的已經存儲過鹽值的值進行比較。

祝你好運。

(1) - 當CEO發現他的密碼已被存儲爲可利用的格式時,您的位置有多大?對我們這些黑魔法師有一定程度的信任,這種信任帶來了自己的風險。注意它們。 ;-)

編輯

工作的示例:

爲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> 

更新: 您還可能有興趣在簡單的定義處理程序更高的範圍,將觀看所有密碼活動:

考慮這個

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

非常感謝你的代碼示例,我會嘗試一下。我當然不會以任何形式保存任何內容,密碼在兩個表格中都是散列的,我將它與鹽一起存儲。我輸入了用戶輸入的密碼,然後將其與我在「OldPassword」表中的密碼進行比較。 再次感謝您的幫助。 – Steve 2010-04-28 02:32:17

+0

@Sky - 你知道爲什麼這不會在我的代碼中觸發嗎? – Steve 2010-04-29 11:16:25

+0

@Steve - (穿上靈通帽)嗯....我覺得你可能沒有在控件上指定ChangingPassword eventHandler是ChangePassword1_ChangingPassword。 (脫掉通靈帽)我怎麼辦? ;-) – 2010-04-29 11:55:12