asp.net получает имя пользователя членства, когда он не прошел проверку подлинности (сброс пароля) - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь реализовать функцию сброса пароля для приложения в ASP.Net Membership.

Чтобы получить пользователя для сброса пароля:

var user = Membership.GetUser(userNameFromSql, false);

Однако этот метод работает только тогда, когда пользователь аутентифицирован. Суть спорная, если пользователь хочет сбросить свой пароль, если он не может войти? Поэтому я ищу альтернативу получению имени пользователя Членства, когда пользователь не аутентифицирован.

Моя функция сброса пароля работает следующим образом. Запрос SQL делается для получения имени пользователя из базы данных, сохраненной как userNameFromSql.

var user = Membership.GetUser(userNameFromSql, false);
string newPassword = txtNewPassword.Text;

if ((newPassword.Length >= Membership.MinRequiredPasswordLength) &&
    (newPassword.ToCharArray().Count(c => !Char.IsLetterOrDigit(c)) >=
            Membership.MinRequiredNonAlphanumericCharacters) &&
    ((Membership.PasswordStrengthRegularExpression.Length == 0) ||
            Regex.IsMatch(newPassword, Membership.PasswordStrengthRegularExpression)))
{
    user.ChangePassword(user.ResetPassword(), newPassword);
    lblMessage.Text = "Password Changed Successfully!";
    return true;
}

Доступ к странице осуществляется как перенаправление по ссылке электронной почты, содержащей GUID для сброса пароля. Таким образом, страница проверена, userName из базы данных также является допустимым (т. Е. В базе данных существует действительный пользователь, который запросил изменение пароля), но я не могу передать этого пользователя в метод Membership.GetUser (), как всегда возвращает NULL, когда пользователь не аутентифицирован.

Как мне поступить? Надеюсь это достаточная информация? В качестве альтернативы, я мог бы вручную сбросить пароль пользователя, сделав запрос на обновление базы данных aspnetdb (которая содержит пользователей членства), хэшируя ее, используя

crypto.hashPassword(string)

но метод хеширования должен быть идентичен методу хеширования самого участника, иначе он не сможет восстановить пароль снова?

большое спасибо

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Membership.GetUser(userNameFromSql, false) должно работать и на самом деле Membership.GetUser(userNameFromSql) должно быть достаточно. Если он возвращает null, значит, ваш userNameFromSql неверен.

0 голосов
/ 12 ноября 2018

Я использую эту функцию, чтобы сделать это, возможно, она может вам помочь:

    public bool ChangePassword(string userId, string newPassword)
        {
            _userManager.UserValidator = new UserValidator<IdentityUser>(_userManager) { AllowOnlyAlphanumericUserNames = false };
            var identityUser = _userManager.FindById(userId);
            identityUser.PasswordHash = _userManager.PasswordHasher.HashPassword(newPassword);
            var result = _userManager.Update(identityUser);
            return true;

        }
...