下面是"Asp.Net Core中基于Session的身份验证的实现"的详细攻略。
简介
身份验证是Web应用程序中必不可少的功能之一。在ASP.NET Core中,我们可以使用Session来实现身份验证。Session是一种记录Web应用程序状态的机制,它允许我们将数据在不同的页面间传递和存储。在ASP.NET Core中,Session机制支持在Web服务器上存储数据,为应用程序提供了一个简单的方式来实现身份验证。
实现步骤
实现asp.net core的基于Session的身份验证,需要完成以下步骤:
- 在Startup.cs文件中启用Session机制和身份验证;
- 在登录页面进行身份验证;
- 在视图中检查是否已经登录;
- 在注销页面注销用户。
下面我们逐步介绍每个步骤。
1. 在Startup.cs文件中启用Session机制和身份验证
在ConfigureServices方法中,添加以下代码:
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
options.AccessDeniedPath = "/Account/AccessDenied";
});
该代码主要完成Session的配置和身份验证的操作。配置Session所使用的缓存和Cookie,提供了整体的Session操作。添加AddAuthentication后,使用的是Cookie验证,其中登录路径和没有访问权限的页面需要通过options来配置。
2. 在登录页面进行身份验证
在登录页面中,添加提交表单的代码,用来验证输入的用户名和密码是否正确:
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel loginViewModel)
{
if (ModelState.IsValid)
{
if (loginViewModel.UserName == "admin" && loginViewModel.Password == "123")
{
// valid user, create the session
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, loginViewModel.UserName),
new Claim(ClaimTypes.Role, "Admin")
};
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties
{
IsPersistent = loginViewModel.RememberMe
};
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);
return RedirectToAction("Index", "Home");
}
else
{
// invalid user
ModelState.AddModelError("", "Invalid username or password");
}
}
return View(loginViewModel);
}
当用户提交表单后,会使用提供的用户名和密码进行验证。如果验证成功,就会创建一个session,同时将相应的信息填充到负责保存用户认证信息的 ClaimsIdentity 和 AuthenticationProperties 对象中,并继续重定向到“主页”页面。这里选用了CookieAuthenticationDefaults.AuthenticationScheme来设置用户标志以及是不是记住登录状态。在记住登录状态时,下次会自动登陆,如果改成false则每次都需要重新认证。
3. 在视图中检查是否已经登录
在视图文件中,检查用户是否已经登录是验证用户的简单方式。它只需在需要这样做的页面上添加以下代码:
@using Microsoft.AspNetCore.Authentication
@inject SignInManager<IdentityUser> SignInManager
@inject IHttpContextAccessor HttpContextAccessor
@if (SignInManager.IsSignedIn(HttpContext.User))
{
<form method="post" asp-action="Logout" asp-controller="Account">
<button type="submit" class="btn btn-link">Logout</button>
</form>
}
else
{
<form method="post" asp-action="Login" asp-controller="Account">
<input type="text" asp-for="UserName" placeholder="User name" required autofocus>
<input type="password" asp-for="Password" placeholder="Password" required>
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
}
让我们来看看这段代码分别做了什么:
- @inject SignInManager
SignInManager:使用 ASP.NET Core 的身份验证管理器 SignInManager,我们可以执行用户登录和注销等操作。 - @inject IHttpContextAccessor HttpContextAccessor:这个服务允许你拿到 HTTP 请求和响应的上下文信息。
- @if (SignInManager.IsSignedIn(HttpContext.User)):检查用户是否已经登录,如果是,就显示可注销的菜单项,否则,就显示登录表单输入框。
<form method="post" asp-action="Logout" asp-controller="Account">...</form>
:悬浮选择项,如果用户已经登录,就显示可注销操作,否则就不会。
4. 在注销页面注销用户
当用户注销时,我们需要清除具有用户身份的 session。注销用户的方法如下:
[HttpPost]
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToAction("Index", "Home");
}
该代码调用SignOutAsync方法来注销用户并且重定向到主页。
至此,整个基于session的身份验证的实现就完成了。在用户提交表单后,会判断用户名和密码是否正确,如果是,程序会创建代表用户的 session,并给使用该浏览器的所有后续请求设置自动提交该 session。这样,即可保证用户已经得到身份验证。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Asp.Net Core中基于Session的身份验证的实现 - Python技术站