0

У меня есть сайт DNN, работающий с DNN 7.04.00 (353). Я не могу сбросить пароли на моем сайте. Если я использую встроенную функцию сброса пароля, я могу получить электронное письмо с сбросом пароля со ссылкой. Я нажимаю ссылку, указываю свой адрес электронной почты и новый пароль. Независимо от того, что я делаю, я продолжаю получать сообщение об ошибке: «Ваш новый пароль не был принят по соображениям безопасности. Обязательно выберите пароль, который не соответствует ранее использованному паролю и который является длинным и сложным, чтобы встретить сайты требования к сложности пароля. "DNN (DotNetNuke) - Сброс пароля хранится в таблице PasswordHistory, а не aspnet_Membership

Вот что странно, я вхожу в сильный пароль, который никогда не использовался раньше. Когда я это делаю, я вижу следующее:

  • Ссылка на сброс пароля отправляется с токеном пароля. Я вижу этот же токен в таблице «Пользователи».
  • Я следую ссылке. Попытайтесь сбросить пароль, используя действующий и не использованный ранее пароль. Независимо от того, я получил ошибку выше.
  • Значение столбца Users.PasswordResetToken сбрасывается. Для параметра Users.PasswordRestExpiration установлено значение null. Это говорит мне, что я использовал токен, и он больше недействителен.
  • Вот что действительно странно ... aspnet_Membership.Password hash value никогда не меняется ... хорошо, что делает, поскольку я не смог с успехом изменить пароль. Однако теперь у меня есть новая запись в таблице PasswordHistory. Значение здесь хешировано, однако похоже, что введенный пароль сброса был сохранен в таблице PasswordHistory ... новый пароль не был сохранен в таблице aspnet_Membership.

Независимо от того, что мой пароль не принят, однако он хранится в таблице PasswordHistory. Кто-нибудь знает, что может это сделать? Несколько примечаний, которые могут вам помочь:

  • Пользователи регистрируются для учетных записей на моем сайте через пользовательский модуль регистрации, а не модуль регистрации DNN по умолчанию.
  • В web.config DNN У меня есть следующие настройки
    • passwordStrengthRegularExpression не существует, я удалил это полностью из web.config для устранения неполадок.
    • EnablePasswordReset верно
    • 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», и он все еще не работает :( Есть ли у вас какие-либо другие идеи? Единственное, что приходит на ум, это мой пользовательский пользователь чтобы проверить, подходит ли вам аккаунт для регистрации. – KPhillipson

+0

Возможно, вам потребуется прислать код своего входа в систему, а именно пароль для ввода пароля. Глядя на поставщика, который я построил, я использую следующие строки для установки пароля на объекте UserInfo: /* установить членство */ UserMembership oNewMembership = новый UserMembership (oUser) {Password = пароль}; /* Bind членство для пользователя */ oUser.Membership = oNewMembership; – DotNetNuclear

+0

Я добавил свой собственный регистрационный код в исходное сообщение. Еще раз спасибо за вашу помощь. – KPhillipson