Идентификационные данные ядра - PullRequest
0 голосов
/ 17 сентября 2018

При неудачном входе в систему я хочу знать, было ли это имя пользователя, пароль или что-то еще.

var signinResult = await _signInManager.PasswordSignInAsync(
    loginViewModel.UserName,
    loginViewModel.Password,
    false, false);

возвращает SignInResult, который просто говорит мне, что он не разрешен.

Могу ли я как-то получить более значимую причину от Идентичности?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

PasswordSignInAsync возвращает только общий сбой, если имя пользователя / пароль неверны. Это потому, что вы действительно не должны разоблачать, что неправильно в первую очередь. Если вы прямо скажете конечному пользователю, что пароль неправильный, то теперь он знает, что имя пользователя хорошее. Если это злонамеренный пользователь, вы сократили его работу вдвое. Теперь они могут просто взломать пароль.

Если вы хотите получить эту информацию, просто попробуйте сначала получить пользователя по имени:

var user = await _userManager.FindByNameAsync(loginViewModel.UserName);
if (user == null)
{
    // username is invalid
}

// Now attempt to login with password.
0 голосов
/ 17 сентября 2018

NotAllowed означает, что адрес электронной почты или номер телефона не были подтверждены (и требуется подтверждение). Вы можете проверить это явно следующим образом (при условии, что у вас есть экземпляр UserManager из DI):

await _userManager.IsEmailConfirmedAsync(user);
await _userManager.IsPhoneNumberConfirmedAsync(user);

Чтобы использовать любую из этих двух функций, вам потребуется user, который можно получить следующим образом:

var user = await _userManager.FindByNameAsync(loginViewModel.UserName);

Чтобы определить, не удалось ли указать имя пользователя или пароль, сначала необходимо проверить IsLockedOut, IsNotAllowed и RequiresTwoFactor. Если все они возвращают false, имя пользователя или пароль неверны. Чтобы определить, какая из них является проблемой, вы можете проверить возвращаемое значение из await _userManager.FindByNameAsync(user). Вот полный пример:

var signinResult = await _signInManager.PasswordSignInAsync(
    loginViewModel.UserName,
    loginViewModel.Password,
    false, false);

var user = await _userManager.FindByNameAsync(loginViewModel.UserName);

if (signinResult.IsNotAllowed)
{
    if (!await _userManager.IsEmailConfirmedAsync(user))
    {
        // Email isn't confirmed.
    }

    if (!await _userManager.IsPhoneNumberConfirmedAsync(user))
    {
        // Phone Number isn't confirmed.
    }
}
else if (signinResult.IsLockedOut)
{
    // Account is locked out.
}
else if (signinResult.RequiresTwoFactor)
{
    // 2FA required.
}
else
{
    // Username or password is incorrect.
    if (user == null)
    {
        // Username is incorrect.
    }
    else
    {
        // Password is incorrect.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...