DNN (DotNetNuke) - Нулиране на парола, съхранено в таблицата PasswordHistory, а не aspnet_Membership

Имам DNN сайт, работещ с DNN 7.04.00 (353). Не мога да нулирам пароли на моя сайт. Ако използвам вградената функция за нулиране на парола, мога да получа имейл за нулиране на парола с връзка. Щраквам върху връзката, въвеждам своя имейл адрес и новата парола. Каквото и да правя, продължавам да получавам грешка, която гласи: „Вашата нова парола не беше приета от съображения за сигурност. Моля, уверете се, че сте избрали парола, която не съответства на използвана преди това парола и която е достатъчно дълга и сложна, за да отговаря на сайтовете изисквания за сложност на паролата."

Ето какво е странното в това, въвеждам силна парола, която никога не е била използвана преди. Когато правя това, виждам как се случват следните неща:

  • Връзката за повторно задаване на парола се изпраща с маркер за парола. Виждам същия този токен в таблицата „Потребители“.
  • Следвам линка. Опитайте се да нулирате паролата, като използвате валидна и неизползвана преди това парола. Без значение какво, получавам грешката по-горе.
  • Стойността на колоната Users.PasswordResetToken се нулира. Users.PasswordRestExpiration е зададен на null. Това ми казва, че съм използвал токена и той вече не е валиден.
  • Ето какво е наистина странно... хеш стойността на aspnet_Membership.Password никога не се променя... добре, тъй като не можах успешно да променя паролата. Сега обаче имам нов запис в таблицата PasswordHistory. Стойността тук е хеширана, но изглежда, че въведената от мен парола за нулиране е съхранена в таблицата PasswordHistory... новата парола не е съхранена в таблицата aspnet_Membership.

Без значение каква е паролата ми, която не се приема, тя се съхранява в таблицата PasswordHistory. Някой има ли идея какво може да причини това? Няколко бележки, които могат да помогнат:

  • Потребителите се регистрират за акаунти на моя сайт чрез персонализиран регистрационен модул, а не DNN регистрационния модул по подразбиране.
  • In the DNN web.config I have the following settings
    • passwordStrengthRegularExpression is non-existent, I have removed this completely from web.config for troubleshooting.
    • enablePasswordReset е вярно
    • requireQuestionAndAnswer е вярно
    • passwordFormat е хеширан

Благодаря ти за помощта.


person KPhillipson    schedule 10.07.2015    source източник


Отговори (1)


Разглеждайки основния код (UserController.ChangePasswordByToken()), изглежда, че проверката на хронологията на паролите се случва преди валидирането на паролата. Проверката на хронологията също добавя опита за парола към хронологията. Така че може да е възможно, ако паролата ви не отговаря на правилата за валидиране, да я добави към хронологията, без да я променя.

В Хост > Настройки на хост > Разширени настройки > Управление на членството можете да деактивирате хронологията, като премахнете отметката от „Активиране на хронология на паролите”.

Но трябва да се съсредоточите върху проверката на паролата, защото изглежда, че не работи. Състои се от три атрибута на AspNetSqlMembershipProvider във вашия web.config:

  • minRequiredPasswordLength
  • minRequiredNonalphanumericCharacters
  • паролаStrengthRegularExpression

Както споменахте, 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);
person DotNetNuclear    schedule 10.07.2015
comment
Благодарим Ви за обратната връзка. За съжаление все още не мога да накарам това да работи. Имам тези атрибути със следните стойности: minRequiredPasswordLength=8 minRequiredNonalphanumericCharacters=1. Използвам чисто нова парола, която току-що измислих, ChickEnHea%d, и тя все още не работи :( Имате ли други идеи? Единственото нещо, което ми идва на ум е, че може би моят персонализиран потребителски модул за регистрация не е правя нещо, което трябва, за да може нулирането на паролата да работи. Използвам обекта UserMembership за попълване на пароли при създаване на акаунт. - person KPhillipson; 10.07.2015
comment
Може да се наложи да предоставите фрагмент от вашия код на доставчик на вход. Особено как е зададена паролата. Разглеждайки доставчик, който създадох, използвам следните редове, за да задам паролата на обект UserInfo: /*Set Membership*/ UserMembership oNewMembership = new UserMembership(oUser) { Password = password }; /*Свързване на членство с потребител*/ oUser.Membership = oNewMembership; - person DotNetNuclear; 10.07.2015
comment
Добавих персонализирания си регистрационен код към оригиналната публикация. Благодаря ви отново за помощта. - person KPhillipson; 10.07.2015
comment
Стесних грешката до този код в \admin\security\PasswordReset.ascx.cs if (UserController.ChangePasswordByToken(PortalSettings.PortalId, username, txtPassword.Text, ResetToken) == false) { resetMessages.Visible = true; var failed = Localization.GetString(PasswordResetFailed, LocalResourceFile); LogFailure(неуспешно); //lblHelp.Text = неуспешно; lblHelp.Text = тук 4; } - person KPhillipson; 10.07.2015