Проверьте учетные данные, прежде чем сообщать, что адрес электронной почты необходимо подтвердить - PullRequest
0 голосов
/ 31 марта 2020

Я использую Asp. Net Core Razor Pages с идентификацией. В настоящий момент у меня для RequireConfirmedAccount установлено значение true в методе ConfigureServices класса Startup, и я проверяю подтвержденный адрес электронной почты следующим образом:

            ApplicationUser user = await userManager.FindByEmailAsync(Email);

            if (user != null)
            {
                bool emailConfirmed = await userManager.IsEmailConfirmedAsync(user);

                if (emailConfirmed != true)
                {
                    return RedirectToPage("/Account/ConfirmEmail");
                }
                else
                {
                    var result = await signInManager.PasswordSignInAsync(Email, Password,
                            RememberMe, lockoutOnFailure: true);

                    if (result.IsLockedOut)
                    {
                        return RedirectToPage("/Account/Lockout");
                    }

                    if (result.Succeeded)
                    {
                        // etc

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

                    if (result.SucceededButEmailNotConfirmed)
                    {
                        return RedirectToPage("/Account/ConfirmEmail");

Есть ли хороший способ сделать это? Единственное решение, которое я до сих пор придумала, - установить для RequireConfirmedAccount значение false, затем после успешного входа в систему проверить код, подтвержден ли адрес электронной почты, и выйти из системы, если пользователь не подтвердил. Есть ли лучший способ сделать это, или я что-то упустил? Спасибо

1 Ответ

1 голос
/ 31 марта 2020

Трой Хант, Microsoft MVP имеет отличный пост, в котором рассказывается о том, как сделать страницу безопасного сброса пароля (которая имеет некоторые сходства с вашим сценарием):

https://www.troyhunt.com/everything-you-ever-wanted-to-know/

Если вы читаете раздел под названием «Перечисление имени пользователя и влияние на анонимность», рекомендуется не отображать сообщение на вашей странице, которое меняется в зависимости от того, есть ли у вас учетная запись пользователя, связанная с этим письмом, в база данных. Скорее, вы отправите информацию на адрес электронной почты о том, что делать дальше. Следующим шагом может быть необходимость регистрации (так как у них нет учетной записи), или это может быть ссылка для подтверждения своего адреса электронной почты.

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

https://www.troyhunt.com/website-enumeration-insanity-how-our-personal-data-is-leaked/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...