您的位置:首页 > 编程语言 > ASP

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

2019-09-02 15:35 1686 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_25991955/article/details/100200599

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

做好了用户的添加和编辑后,就可以做一个用户登录!
在这里在注意一下.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");

3ff8
}

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内置身份验证做的,很多详细功能可以参考官方文档。目前做的练习在博客中写的都很详细,直接复制粘贴都能运行。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐