如果在ASP中找不到用户,则使用电子邮件或用户名登录的用户将为null.NET核心MVC



我使用的是经过一些修改的默认标识页面,在登录页面中我包含了用户登录的用户名。它工作得很好,用户现在可以通过电子邮件和用户名登录,但当用户输入虚假信息时,会出现一个null异常,而不是显示

登录尝试无效

代码:

if (ModelState.IsValid)
{
//Check if user entered email or username in the Input.Email property
var user = await _userManager.FindByNameAsync(Input.Email) ?? await _userManager.FindByEmailAsync(Input.Email);
// user is null if not exist? error
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(user, Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
//some code
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}

我知道错误发生的原因,但不知道解决它的正确方法是什么。

最初signInManager检查的是用户输入,而不是实际用户,所以如果没有找到输入,它就不会成功,我怎么能用同样的方法呢?

当用户输入错误信息时,会出现一个空异常

PasswordSignInAsync(TUser, String, Boolean, Boolean)方法的源代码中,我们可以发现如果用户为null,它会抛出NullException错误。

public virtual async Task<SignInResult> PasswordSignInAsync(TUser user, string password,
bool isPersistent, bool lockoutOnFailure)
{
if (user == null)
{
throw new ArgumentNullException(nameof(user));
}
var attempt = await CheckPasswordSignInAsync(user, password, lockoutOnFailure);
return attempt.Succeeded
? await SignInOrTwoFactorAsync(user, isPersistent)
: attempt;
}

我怎么能用同样的老方法呢?

您可以如下修改代码,以检查用户是否为null,并设置和显示"登录尝试无效"错误消息。

var user = await _userManager.FindByNameAsync(Input.Email) ?? await _userManager.FindByEmailAsync(Input.Email);
if (user == null)
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
var result = await _signInManager.PasswordSignInAsync(user, Input.Password, Input.RememberMe, lockoutOnFailure: true);
//...
//code logic here

最新更新