登录失败时,我想知道它是用户名,密码还是别的。
var signinResult = await _signInManager.PasswordSignInAsync(
loginViewModel.UserName,
loginViewModel.Password,
false, false);
返回SignInResult,它只是告诉我它是NotAllowed。
我能以某种方式从身份获得更有意义的理由吗?
NotAllowed
表示电子邮件或电话号码尚未确认(需要确认)。您可以使用以下内容明确检查(假设您有来自DI的UserManager
实例):
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.
}
}
如果用户名/密码不正确,PasswordSignInAsync
仅返回一般失败。这是因为你真的不应该首先暴露哪个是错的。如果您明确告诉最终用户密码错误,那么他们现在知道用户名是好的。如果这是恶意用户,那么你的工作减半了。现在他们可以强制密码了。
但是,如果您确实需要此信息,只需尝试通过用户名首先获取用户:
var user = await _userManager.FindByNameAsync(loginViewModel.UserName);
if (user == null)
{
// username is invalid
}
// Now attempt to login with password.