Элемент управления ChangePassword членства в ASP.NET - необходимо проверить предыдущий пароль - PullRequest
5 голосов
/ 27 апреля 2010

У меня есть новая таблица со старыми паролями, мне нужно проверить, есть ли совпадение.

Если есть совпадение, мне нужен контроллер 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 Ответ

6 голосов
/ 27 апреля 2010

Вы отвергаете неправильный метод, Стив. Вы хотите переопределить отменяемый 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 хранить пароль пользователя 1 . Перейдите к таблице членства и получите соль и используйте ее, чтобы хэшировать входящий пароль, чтобы сравнить с уже хешированными значениями, которые вы сохранили в таблице поиска.

Удачи.

(1) - насколько надежной была бы ваша позиция, когда генеральный директор узнает, что его пароль был сохранен в пригодном для использования формате? Существует уровень доверия к темнокожим магам, которые являются нами, и это доверие несет свои собственные риски. Будь в курсе их. ; -)

EDIT

Рабочий пример:

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");

}
...