Благодарю. Я думаю, что это будет работать. Кроме того, вы убедили меня в том, что пользователи явно сбрасывают свой пароль. Кроме того, мы можем повысить требования к более надежному паролю.

строили Asp.Net Core для использования нашей таблицы студентов, а не таблицы AspNetUser. Все отлично работает для новых студентов. Но нам нужно обновить пароли существующих студентов. Я хотел бы сделать что-то вроде этого (вAccountController Login метод), когда студент входит в систему или это может быть сделано единовременно ...

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
        // Require the user to have a confirmed email before they can log on.
        var user = await _userManager.FindByEmailAsync(model.Email);
        if (user != null)
        {
            if (user.PasswordHash == null)
            {
                user.EmailConfirmed = true;
                user.UserName = model.Email;
                user.NormalizedEmail = model.Email.ToUpper();
                user.NormalizedUserName = user.NormalizedEmail;
                //user.PasswordHash = ?;
                //user.SecurityStamp = ?;
                //update user in database.
            }
            //continue on with login process
        }
    }
}

Код ниже (изRegister метод) создает нового пользователя и добавляет его в базу данных. Это не то, что мы хотим.

var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
    // …
 William Lucas25 дек. 2017 г., 00:59
Конечно, это может быть сделано за один раз, однако, все еще нужно знать, как это сделать, чтобы он создавал те же хеш-коды и метки безопасности, которые могла бы использовать система идентификации. Поскольку база данных не была взломана, и мы используем SSL, я не думаю, что они были разоблачены. Клиент пытается поступить правильно. Если у вас есть ответ на этот вопрос, я хотел бы увидеть его.
 poke24 дек. 2017 г., 23:57
Как пользователь должен войти в систему, когда хэш пароля явноnull? Какой пароль тогда будет использовать пользователь, и как вы будете проверять, является ли он настоящим пользователем?
 poke25 дек. 2017 г., 00:00
Почему бы вам не заблокировать всех пользователей, которые должны изменить свой пароль, а затем объяснить, что им нужно запросить новый пароль, используя ссылку «пароль забыт»? Таким образом, Identity сгенерирует токен сброса пароля, который затем пользователи смогут использовать для правильной установки собственного пароля.
 William Lucas25 дек. 2017 г., 00:27
Студенты будут входить в систему с паролем в виде простого текста. Если у меня совпадают адрес электронной почты и пароль, я знаю, что это авторизованный пользователь, по крайней мере, на уровне, который был в прошлом. - Этот код находится перед тем, как вы перейдете к точке, где система идентификации проверяет хэш пароля. Если бы я мог сделать эту работу, изменение было бы полностью прозрачным для пользователя.
 poke25 дек. 2017 г., 00:46
Таким образом, вы бы просто использовать существующий паролькоторый хранится в виде простого текста? (а) Почему бы вам не преобразовать все пароли за один раз, без необходимости входа пользователя? (б) Это ужасная идея в любом случае. Если вы ранее хранили пароли в виде простого текста, вам следуетабсолютно требовать от пользователейменять их пароль и хранить новый пароль только в зашифрованном виде. Пароли в виде простого текста нарушаются, и пользователи должны знать, что они были открыты в виде простого текста, поэтому они избегают их навсегда.

Ответы на вопрос(1)

Решение Вопроса

UserManager есть все, что вам нужно, чтобы установить пароль для пользователя. Несмотря на то, что вы могли бы использовать внутренний хэш-пароль напрямую, прохождение через диспетчер пользователей гарантирует, что пользовательский объект обновляется должным образом по отношению к паролю. Таким образом, вы можете просто положиться на менеджера пользователей, чтобы «делать правильные вещи».

Если у пользователя нет пароля, вы можете использоватьAddPasswordAsync установить это:

var user = await _userManager.FindByEmailAsync(model.Email);
if (user != null && !(await _userManager.HasPasswordAsync(user)))
{
    // retrieve plaintext password
    var originalPassword = GetPlainTextPassword(user);

    var result = await _userManager.AddPasswordAsync(user, originalPassword);

    if (!result.Succeeded)
    {
        // handle error
    }
}

В противном случае вы также можете использовать поток сброса пароля и сгенерировать токен, который вы сразу же будете использовать для сброса пароля пользователя (без участия пользователя). Таким образом, вы бы в основном цепиGeneratePasswordResetTokenAsync а такжеResetPasswordAsync, Конечно, это следует делать только по причинам технического обслуживания:

var user = await _userManager.FindByEmailAsync(model.Email);
if (user != null)
{
    // retrieve plaintext password
    var originalPassword = GetPlainTextPassword(user);

    // retrieve token
    var resetToken = await _userManager.GeneratePasswordResetTokenAsync(user);

    // reset password
    var result = await _userManager.ResetPasswordAsync(user, resetToken, originalPassword);

    if (!result.Succeeded)
    {
        // handle error
    }
}

Независимо от этого, я все равно предлагаю вам активнотребовать пользователи сами сбрасывают свои пароли. Просто удалите текстовые пароли из базы данных и оставьте пустой пароль. Таким образом, пользователи должны будут сначала сбросить свой пароль (вы должны добавить примечание, объясняющее, что им придется сделать это до первого входа в систему), иникто когда-нибудь сможет увидеть свой новый пароль в виде обычного текста. - Старые пароли хранятся в базе данных и, вероятно, (надеюсь ?!) большое количество резервных копий, и даже если вы считаете, что ваша система безопасна, она, вероятно, не идеальна. И все же есть вовлеченные люди, которые имеют доступ к базе данных и могут прямо или косвенно раскрывать эти пароли другим (с добрыми намерениями или без них). Вы не должны доверять своей системе достаточно, чтобы ничего не пошло не так. И пользователям не нужно доверять вам безопасность своих паролей. Вы должны сказать им, чтобы сделать новый пароль и избавиться от своих старых - лучше раньше, чем позже.

 William Lucas25 дек. 2017 г., 02:13
Благодарю. Я думаю, что это будет работать. Кроме того, вы убедили меня в том, что пользователи явно сбрасывают свой пароль. Кроме того, мы можем повысить требования к более надежному паролю.

Ваш ответ на вопрос