.net核心标识,有意义的登录失败原因

use*_*625 2 c# asp.net-core asp.net-core-identity

登录失败时,我想知道它是用户名,密码还是其他。

var signinResult = await _signInManager.PasswordSignInAsync(
    loginViewModel.UserName,
    loginViewModel.Password,
    false, false);
Run Code Online (Sandbox Code Playgroud)

返回SignInResult,它仅告诉我它是NotAllowed。

我能以某种方式从身份中获得更有意义的理由吗?

Kir*_*kin 6

NotAllowed表示电子邮件或电话号码尚未确认(需要确认)。您可以使用类似以下内容的方法显式检查此内容(假设您有一个UserManager来自DI 的实例):

await _userManager.IsEmailConfirmedAsync(user);
await _userManager.IsPhoneNumberConfirmedAsync(user);
Run Code Online (Sandbox Code Playgroud)

要使用这两个功能中的任何一个,您需要user

var user = await _userManager.FindByNameAsync(loginViewModel.UserName);
Run Code Online (Sandbox Code Playgroud)

要确定它是否是用户名或失败的密码,您需要先检查IsLockedOutIsNotAllowedRequiresTwoFactor。如果所有这些都返回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.
    }
}
Run Code Online (Sandbox Code Playgroud)