asp.net在未经身份验证时获取成员身份用户的用户名(重置密码)

时间:2018-11-12 11:54:36

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

我正在尝试为ASP.Net Membership中的应用程序实现重置密码功能。

为了使用户能够重置密码:

var user = Membership.GetUser(userNameFromSql, false);

但是,该方法仅在用户通过身份验证时才有效。如果用户要重设密码的原因是无法登录,那是没有意义的?因此,我正在寻找一种在用户未通过身份验证时获取成员资格用户名的替代方法。

我的重置密码功能如下。进行SQL查询以从数据库中检索用户名,该用户名存储为userNameFromSql。

var user = Membership.GetUser(userNameFromSql, false);
string newPassword = txtNewPassword.Text;

if ((newPassword.Length >= Membership.MinRequiredPasswordLength) &&
    (newPassword.ToCharArray().Count(c => !Char.IsLetterOrDigit(c)) >=
            Membership.MinRequiredNonAlphanumericCharacters) &&
    ((Membership.PasswordStrengthRegularExpression.Length == 0) ||
            Regex.IsMatch(newPassword, Membership.PasswordStrengthRegularExpression)))
{
    user.ChangePassword(user.ResetPassword(), newPassword);
    lblMessage.Text = "Password Changed Successfully!";
    return true;
}

可通过包含电子邮件密码重置的GUID的电子邮件链接的重定向访问该页面。因此,该页面已通过验证,数据库中的userName也是合法的(即,数据库中存在一个要求更改密码的有效用户),但我无法像以往一样将此用户传递给Membership.GetUser()方法如果用户未通过身份验证,则返回NULL。

我该如何进行?我希望这是足够的信息?另外,我可以通过使用

对其进行哈希查询来对aspnetdb数据库(包含成员用户)进行更新查询来手动重置用户密码。
crypto.hashPassword(string)

,但是散列方法必须与Membership本身的散列方法相同,否则它将无法再次检索密码?

非常感谢

2 个答案:

答案 0 :(得分:0)

我使用此功能可以帮助您:

    public bool ChangePassword(string userId, string newPassword)
        {
            _userManager.UserValidator = new UserValidator<IdentityUser>(_userManager) { AllowOnlyAlphanumericUserNames = false };
            var identityUser = _userManager.FindById(userId);
            identityUser.PasswordHash = _userManager.PasswordHasher.HashPassword(newPassword);
            var result = _userManager.Update(identityUser);
            return true;

        }

答案 1 :(得分:0)

Membership.GetUser(userNameFromSql, false)应该可以工作,实际上Membership.GetUser(userNameFromSql)应该足够了。如果它返回null,那么您的userNameFromSql是错误的。