【问题标题】:ASP.NET Membership ChangePassword control - Need to check for previous passwordASP.NET Membership ChangePassword 控件 - 需要检查以前的密码
【发布时间】:2011-02-12 20:44:16
【问题描述】:

我有一个保存旧密码的新表,我需要检查是否匹配。

如果匹配,我需要 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!";
                }
            }

【问题讨论】:

  • 我不确定您要在这里做什么。您谈到想要验证旧密码,但您的 SQL 语句检索用户名并且从不检查密码。您如何验证密码本身?
  • 是的,你是对的,那段代码在不同的页面上,我只是很快地整理了一个测试页面,很抱歉造成混乱。我只是在中断过程本身时遇到了麻烦。感谢您的意见。
  • @Sky - 是的,我实际上已经完成了,我现在正在清理代码,进行更多测试。我会尽快发布。再次感谢您的所有帮助!
  • 我需要的所有感谢都是赞成票和复选标记!很乐意提供帮助。

标签: c# asp.net-membership membership membership-provider


【解决方案1】:

史蒂夫,你覆盖了错误的方法。您想覆盖可取消的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;
    }

}

而且,根据之前的问答环节,您永远不应该永远存储用户的密码1。转到成员资格表并获取 salt 并使用它对传入的密码进行哈希处理,以与您存储在查找表中的已经经过 salt 哈希处理的值进行比较。

祝你好运。

(1) - 当 CEO 发现他的密码被以可利用的格式存储时,你的立场会有多大?对我们这样的黑魔法师有一定程度的信任,而这种信任本身就有风险。注意他们。 ;-)

编辑

一个工作示例:

更改密码.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");

}

【讨论】:

  • 非常感谢您的代码示例,我会尝试一下。我当然不会以清晰的格式保存任何东西,密码在两个表中都经过哈希处理,我用它存储了盐。我有用户输入的密码,然后将其与“OldPassword”表中的密码进行比较。再次感谢您的帮助。
  • @Steve - (戴上通灵帽)嗯....我感觉您可能没有在控件上指定ChangingPassword eventHandler 是ChangePassword1_ChangingPassword。 (摘下通灵帽)我是怎么做到的? ;-)
  • @Steve - 我正在清理我的一些旧代码,并找到了另一个关于如何在可能感兴趣的更高范围内处理密码活动的示例。
  • @SkySanders,很好的答案,但我更喜欢 Black Mage 这个词。
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 2011-02-04
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2012-01-18
相关资源
最近更新 更多