DNN(DotNetNuke) - 密码重置存储在PasswordHistory表中,而不是aspnet_Membership

时间:2015-07-10 04:41:17

标签: passwords asp.net-membership dotnetnuke membership-provider dotnetnuke-7

我有一个运行DNN 7.04.00(353)的DNN站点。我无法在我的网站上重置密码。如果我使用内置密码重置功能,我可以收到带有链接的密码重置电子邮件。我点击链接,输入我的电子邮件地址和新密码。无论我做什么,我都会收到错误消息,并且出于安全原因,不会接受您的新密码。请确保选择的密码与以前使用的密码不匹配,并且密码足够复杂,足以满足网站密码复杂性要求。"

这里有什么奇怪的,我正在输入一个以前从未使用过的强密码。当我这样做时,我可以看到以下事情发生:

  • 密码重置链接与密码令牌一起发送。我可以在"用户"中找到相同的标记。表
  • 我按照链接。尝试使用有效且以前未使用过的密码重置密码。无论如何,我收到上述错误。
  • 重置Users.PasswordResetToken列值。 Users.PasswordRestExpiration设置为null。这告诉我,我已经使用了令牌,它已不再有效。
  • 这里有什么真正奇怪的...... aspnet_Membership.Password哈希值永远不会改变......好吧,因为,我无法成功更改密码。但是,我现在在PasswordHistory表中有一个新条目。这里的值是哈希值,但看起来我输入的重置密码存储在PasswordHistory表中......新密码没有存储在aspnet_Membership表中。

无论我的密码是什么都未被接受,但它存储在PasswordHistory表中。有谁知道是什么原因引起的?一些可能有用的注释:

  • 用户通过自定义注册模块注册我网站上的帐户,而不是默认的DNN注册模块。
  • 在DNN web.config中,我有以下设置
    • passwordStrengthRegularExpression不存在,我已经从web.config中完全删除了它以进行故障排除。
    • enablePasswordReset为true
    • requireQuestionAndAnswer为真
    • 密码格式是哈希

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

查看核心代码(UserController.ChangePasswordByToken()),似乎在密码验证之前进行了密码历史记录检查。历史记录检查还会将尝试的密码添加到历史记录中。因此,如果您的密码不符合验证规则,它可能会将其添加到历史记录中而不会更改它。

在主机中>主机设置>高级设置>会员管理,您可以通过取消选中“启用密码历史记录”来禁用历史记录。

但是你需要专注于密码验证,因为它似乎失败了。它由web.config中的AspNetSqlMembershipProvider的三个属性组成:

  • minRequiredPasswordLength
  • minRequiredNonalphanumericCharacters
  • passwordStrengthRegularExpression

如您所述,passwordStrengthRegularExpression为空或缺失,因此不应该引起关注。确保输入的密码符合minRequiredPasswordLength中的最小字符长度,并包含minRequiredNonalphanumericCharacters所需的非字母数字字符数。

以下是我用来注册新用户的一段代码:

newUser = new UserInfo();
newUser.PortalID = this.PortalId;
newUser.IsSuperUser = false;
newUser.FirstName = txtFirstName.Text;
newUser.LastName = txtLastName.Text;
newUser.DisplayName = txtFirstName.Text + " " + txtLastName.Text;
newUser.Email = txtEmailAddress.Text.Trim();
newUser.Username = txtEmailAddress.Text.Trim();
newUser.LastIPAddress = Request.UserHostAddress;
newUser.Profile.ProfileProperties["CompanyName"].PropertyValue = txtCompanyName.Text;
newUser.Profile.ProfileProperties["AddressLine1"].PropertyValue = txtAddressLine1.Text;
newUser.Profile.ProfileProperties["AddressLine2"].PropertyValue = txtAddressLine2.Text;
newUser.Profile.City = txtCity.Text;
newUser.Profile.ProfileProperties["State"].PropertyValue = ddlState.SelectedValue;
newUser.Profile.PostalCode = wmeZipCode.Text.Trim().TrimEnd('-');
newUser.Profile.Telephone = wmePhoneNumber.Text;
if (lblWmePhoneNumberExtension.Text.Trim().CompareTo(String.Empty) != 0) {      newUser.Profile.ProfileProperties["TelephoneExtension"].PropertyValue = wmePhoneNumberExtension.Text; }

var newMembership = new UserMembership(newUser);
newMembership.Approved = true;
newMembership.CreatedDate = DateTime.Now;
newMembership.IsOnLine = false;
newMembership.Password = txtPassword.Text;
newMembership.PasswordQuestion = ddlSecurityQuestion.SelectedValue;
newMembership.PasswordAnswer = txtSecurityQuestionAnswer.Text;
newUser.Membership = newMembership;

UserCreateStatus userStatus = membershipProvider.CreateUser(ref newUser);