我在登录网站时遇到了一点逻辑问题。如果没有注册的电子邮件地址,我希望页面上的验证失败,并在电子邮件地址字段下显示一条消息,上面写着"电子邮件地址不存在"或类似性质的内容。
但我不确定下面的登录代码应该如何处理这个问题......
在此代码中,当找不到电子邮件地址时,下面的"user"为空,因此 PasswordSignInAsync 会引发异常,因为用户。属性为空。
我将如何处理对此的验证,这不应该已经内置到我创建的具有单点登录的 ASP.Net MVC 模板的逻辑中吗?
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Require the user to have a confirmed email before they can log on.
var user = await UserManager.FindByEmailAsync(model.Email);
if (user != null)
{
if (!await UserManager.IsEmailConfirmedAsync(user.Id))
{
string callbackUrl = await SendEmailConfirmationTokenAsync(user.Id, "Confirm your account-Resend");
// Uncomment to debug locally
// ViewBag.Link = callbackUrl;
ViewBag.errorMessage = "You must have a confirmed email to log on. "
+ "The confirmation token has been resent to your email account.";
return View("Error");
}
}
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
消息"无效登录尝试"显示为电子邮件地址字段的验证错误,则必须为保存电子邮件地址的 viewModel 的特定属性设置 ModelError。
所以它应该看起来像这样,而"EmailAdress"是viewModel属性的名称:
ModelState.AddModelError("EmailAddress", "Invalid login attempt.");