0

我有一个运行DNN 7.04.00(353)的DNN网站。我无法重置我的网站上的密码。如果我使用内置的密码重置功能,我可以通过链接接收密码重置电子邮件。我点击链接,输入我的电子邮件地址和新密码。无论我做什么,我都会收到一个错误,指出:“出于安全原因,您的新密码未被接受。请确保选择的密码与先前使用的密码不匹配,并且密码长且足够复杂以符合网站密码复杂性要求“。DNN(DotNetNuke) - 密码重置存储在PasswordHistory表中,而不是aspnet_Membership

下面是它的奇怪之处,我输入了一个以前从未使用过的强密码。当我这样做时,我可以看到以下事情发生:

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

不管我的密码不被接受,但它存储在PasswordHistory表中。有没有人有任何想法可能会导致这种情况?一些注意事项可能有所帮助:

  • 用户通过自定义注册模块注册我的网站上的帐户,而不是默认的DNN注册模块。
  • 在web.config中DNN我有以下设置
    • passwordStrengthRegularExpression是不存在的,我从web.config中的故障排除完全删除这一点。
    • enablePasswordReset设置为true
    • requireQuestionAndAnswer是真的
    • 了passwordFormat被散列

谢谢您的帮助。

回答

1

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

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

但是你需要关注密码验证,因为这似乎是失败的。它由网络中的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); 
+0

感谢您的反馈意见。可悲的是,我仍然无法让这个工作。我具有以下值的属性:minRequiredPasswordLength =“8”minRequiredNonalphanumericCharacters =“1”。我正在使用一个我刚刚编制的全新密码“ChickEnHea%d”,它仍然不起作用:( 您有任何其他想法吗?唯一想到的可能是我的自定义用户注册模块没有做它应该为了使密码重置工作,我正在使用UserMembership对象来填充帐户创建密码 – KPhillipson

+0

您可能需要提供一个登录提供程序代码片段,特别是如何设置密码。看着提供商我建,我用下面的行到的UserInfo对象上设置的密码: /*设置会员*/ UserMembership oNewMembership =新UserMembership(oUser){密码=密码}; /*绑定用户成员*/ oUser.Membership = oNewMembership; – DotNetNuclear

+0

我将自定义注册码添加到原始帖子中。再次感谢你的帮助。 – KPhillipson