ASP.NET CORE[练习7]-Identity-用户登录、最简单的登录验证

练习+博客,量化自己的进步!

做好了用户的添加和编辑后,就可以做一个用户登录!
在这里在注意一下.net core的身份校验的类:
UserManager 管理用户的添加、修改、查找
UserManager.FindByNameAsync() 根据用户账号查找用户

SignInManager 用户的登入登出操作类
SignInManager.PasswordSignInAsync() 根据用户信息和密码判断是否正确,且登入
SignInManager.SignOutAsync() 登出
SignInManager.IsSignedIn(User) 判断是否是登入状态

1.用户登录
2.最简单的登录验证

1.用户登录
1.添加一个AccountController,Action有登录页面、登录提交以及登出。

public class AccountController : Controller
{
    private readonly UserManager<ApplicationUser> userManager;
    private readonly SignInManager<ApplicationUser> signInManager;

    public AccountController(UserManager<ApplicationUser> userManager,SignInManager<ApplicationUser> signInManager)
    {
        this.userManager = userManager;
        this.signInManager = signInManager;
    }

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

    [HttpPost]
    public async Task<IActionResult> Login(LoginViewModel vm)
    {
        if (!ModelState.IsValid)
        {
            ModelState.AddModelError(string.Empty, "登录异常!");
            return View();
        }
        var user = await userManager.FindByNameAsync(vm.UserName);
        if (user == null)
        {
            ModelState.AddModelError(string.Empty, "用户不存在!");
            return View();
        }
        // 后面的两个参数,一个是是否应用到浏览器Cookie,一个是登录失败是否锁定账户。
        var result = await signInManager.PasswordSignInAsync(user, vm.PassWord,false,false);
        if (result.Succeeded)
        {
            return RedirectToAction("Index", "Home");
        }
        ModelState.AddModelError(string.Empty, "账户或密码不正确");
        return View(vm);
    }

    //登出,并且跳转到登录页面
    public async Task<IActionResult> LogOut()
    {
        await signInManager.SignOutAsync();
        return RedirectToAction(nameof(Login));
    }
}

UserManager、SignInManager是.net core内置的服务类,ApplicationUser实体类是自定义的类,继承了IndentityUser类。

2.添加一个LoginViewModel

public class LoginViewModel
    {
        [Required,Display(Name ="账号")]
        public string UserName { get; set; }
        [Required, Display(Name = "密码")]
        public string PassWord { get; set; }
    }

3.登录视图页面

@model LoginViewModel
@{
    ViewData["Title"] = "Login";
}

<h1>用户登录</h1>
<form role="form" method="post" asp-action="Login">
    <div class="form-group row">
        <label class="col-sm-2 col-form-label" asp-for="UserName"></label>
        <div class="col-sm-10">
            <input type="text" asp-for="UserName" />
        </div>
        <span asp-validation-for="UserName"></span>
    </div>
    <div class="form-group row">
        <label class="col-sm-2 col-form-label" asp-for="PassWord"></label>
        <div class="col-sm-10">
            <input type="text" asp-for="PassWord" />
        </div>
        <span asp-validation-for="PassWord"></span>
    </div>
    <button type="submit">登录</button>
</form>

在这里插入图片描述

4.登录状态
登录已经做好了,但要在导航栏上展示登录状态,以及登录、登出的按钮。
需要建立一个部分视图_LoginPartial.cshtml

@using Microsoft.AspNetCore.Identity
@inject SignInManager<ApplicationUser> signInManager
@inject UserManager<ApplicationUser> userManager

<ul class="navbar-nav">
    @if (signInManager.IsSignedIn(User))
    {
        <li class="nav-item">
            <a class="nav-link text-dark">Hello @User.Identity.Name !</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="LogOut">Logout</a>
        </li>
    }
    else
    {
        @*<li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-page="/Account/Register">Register</a>
        </li>*@
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="Login">Login</a>
        </li>
    }
</ul>

SignInManager、UserManager两个服务类要在视图页面中引入。
signInManager.IsSignedIn(User) 判断用户是否登录。
@User.Identity.Name 展示用户信息。

效果图:
在这里插入图片描述
未登录状态,点击Login跳转到登录页面。
在这里插入图片描述
已登录状态,Hello swk ! 是一个状态显示已登录,点击Logout登出并跳转到登录页面。

5.其实,在之前四步就应该做的一步是启用身份验证功能。
starup.cs类的Configure方法中启用,身份验证功能。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseAuthentication(); // 启用身份验证


    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

2.最简单登录验证
网站或系统必须是登录才能访问的:

[Authorize]
public class HomeController : Controller
{
    [Authorize]
    public IActionResult Index()
    {
        return View();
    }
	// 略……

Authorize添加到Controller上,使Controller上的Action都需要登录才能访问。
Authorize添加到Action上,使此Action登录才能访问。

效果演示:
在这里插入图片描述
未登录,点击Home会自动跳转到登录页面。
在这里插入图片描述
同样是未登录,但Student并没有添加登录验证,所以可以访问。

总结
这一套登录验证都是基于.net core内置身份验证做的,很多详细功能可以参考官方文档。目前做的练习在博客中写的都很详细,直接复制粘贴都能运行。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页