登录也需要视图模型
LoginViewModel中有Username和Password2个属性,代码如下:
public class LoginViewModel
{
[Display(Name = "用户名")]
[Required(ErrorMessage = "用户名不能为空")]
public string Username { get; set; } = string.Empty;
[Display(Name = "密码")]
[Required(ErrorMessage = "密码不能为空")]
[DataType(DataType.Password)]
public string Password { get; set; } = string.Empty;
}
其中[DataType(DataType.Password)]
会将input设置为type="password"
。
创建AccountController,并注入SignInManager实例,代码如下:
public class AccountController(SignInManager<IdentityUser> signInManager) : Controller
{
}
将默认的Index动作修改为Login。
public IActionResult Login()
{
return View();
}
在Views下的Account文件夹下创建Login.cshtml视图文件,代码如下:
@{
ViewBag.Title = "登录";
}
@model LoginViewModel
<form method="post" style="width:480px;" class="box mx-auto my-6">
<div asp-validation-summary="All" class="has-text-danger mb-4"></div>
<div class="field">
<label asp-for=Username class="label"></label>
<div class="control">
<input asp-for=Username class="input" />
</div>
</div>
<div class="field">
<label asp-for="Password" class="label"></label>
<div class="control">
<input asp-for="Password" class="input" />
</div>
</div>
<button class="button is-primary">登录</button>
</form>
通过SignInManager的PasswordSignInAsync可以实现登录功能,代码如下:
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel model, string? returnUrl = null)
{
if (ModelState.IsValid)
{
var result = await signInManager.PasswordSignInAsync(model.Username, model.Password, true, false);
if (result.Succeeded)
{
if (!string.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
return RedirectToAction("Index", "Home");
}
}
ModelState.AddModelError(string.Empty, "密码或用户名不正确");
return View(model);
}
其中第一个参数是用户名,第二个参数是密码,第三个参数表示是否记住登录,第四个参数表示如果用户名或密码输入错误是否锁定用户。
PasswordSignInAsync返回一个结果。
如果登录成功,且没有returnUrl,则重定向到主页,否则返回到returnUrl所指的地址。