登录

登录也需要视图模型

创建LoginViewModel

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

创建AccountController,并注入SignInManager实例,代码如下:

public class AccountController(SignInManager<IdentityUser> signInManager) : Controller
{

}

添加Login动作

将默认的Index动作修改为Login。

public IActionResult Login()
{
    return View();
}

创建Login视图

在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>

创建post请求的Login动作

通过SignInManagerPasswordSignInAsync可以实现登录功能,代码如下:

[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所指的地址。