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