練習+博客,量化自己的進步!
做好了用戶的添加和編輯后,就可以做一個用戶登錄!
在這里在注意一下.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內置身份驗證做的,很多詳細功能可以參考官方文檔。目前做的練習在博客中寫的都很詳細,直接復制粘貼都能運行。
————————————————
版權聲明:本文為CSDN博主「修武FEN青」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_25991955/article/details/100200599