Asp.Net Core中基于Session的身份验证的实现

下面是"Asp.Net Core中基于Session的身份验证的实现"的详细攻略。

简介

身份验证是Web应用程序中必不可少的功能之一。在ASP.NET Core中,我们可以使用Session来实现身份验证。Session是一种记录Web应用程序状态的机制,它允许我们将数据在不同的页面间传递和存储。在ASP.NET Core中,Session机制支持在Web服务器上存储数据,为应用程序提供了一个简单的方式来实现身份验证。

实现步骤

实现asp.net core的基于Session的身份验证,需要完成以下步骤:

  1. 在Startup.cs文件中启用Session机制和身份验证;
  2. 在登录页面进行身份验证;
  3. 在视图中检查是否已经登录;
  4. 在注销页面注销用户。

下面我们逐步介绍每个步骤。

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技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • C# Winform程序实现防止多开的方法总结【亲测】

    C# Winform程序实现防止多开的方法总结【亲测】 当我们同事启动我们编写的C# Winform程序时,有时会发现一个很尴尬的问题,同事同时启动了多个程序。这会给我们的程序带来一些问题,如系统资源的浪费等。因此,为了解决这个问题,我们有必要实现一个防止多开的功能。在本文中,我将介绍三种解决方案。 解决方案一:记录程序运行状态 为了能判断程序是否正在运行中…

    C# 2023年6月7日
    00
  • C#知识整理

    C#知识整理攻略 一、概述 学习C#语言需要扎实的基础知识,包括数据类型、变量、运算符、控制结构和函数等。接下来,我们将按照主题对C#知识进行整理。同时,我们也会提供一些实际的示例代码帮助大家更好地理解学习C#。 二、数据类型 C#中的数据类型包括整型、浮点型、布尔型和字符型等, 对于每个类型来说,都有其对应的取值范围和存储大小。具体内容介绍如下: 1. 整…

    C# 2023年5月15日
    00
  • winform基于异步委托实现多线程摇奖器

    下面我会详细讲解如何使用异步委托实现winform的多线程摇奖器。 1. 理解异步委托 异步委托是一种多线程编程技术,适用于需要执行耗时操作而不阻塞主线程的情况。在winform中,我们可以使用异步委托来实现多线程的UI操作,比如在后台计算数据、读取文件等操作时,同时不会阻塞用户界面的响应。 在异步委托中,我们可以使用C#语言中提供的BeginInvoke和…

    C# 2023年6月7日
    00
  • SQLite 入门教程三 好多约束 Constraints

    SQLite 入门教程三 好多约束 Constraints 在SQLite中,可以使用约束(Constraints)来保证表中数据的完整性和一致性。本教程将详细介绍SQLite数据库中支持的主要约束类型。 1. NOT NULL 使用NOT NULL约束可以保证指定的列必须有值,而不能为NULL(即空值)。以下是一个实例: CREATE TABLE Stud…

    C# 2023年5月31日
    00
  • .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)

    在.NET Core部署到linux(CentOS)最全解决方案,常规篇一文,我们详细讲解了传统的.NET Core部署到Linux服务器的方法,学到了Linux在虚拟机下的安装、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的发布与运行全过程。本文讲讲解通过使用Supervisor+Nginx的组合来实…

    C# 2023年4月30日
    00
  • c#版在pc端发起微信扫码支付的实例

    下面我将为您详细讲解c#版在pc端发起微信扫码支付的实例。 准备工作 首先,您需要一个微信商户号和应用密钥,以便进行微信支付。如果您还没有,请前往微信支付官网注册并申请。 其次,使用c#语言的开发环境(如:Visual Studio)来编写代码。 最后,您需要下载微信支付的SDK包,该包提供了相应的API和文档,便于开发。 编写代码 引用微信支付SDK 在代…

    C# 2023年5月31日
    00
  • 快速学习c# 枚举

    快速学习C#枚举 什么是枚举? C#中的枚举类型是一种用户定义的类型,用于定义有限集合的名称。它们依赖于整数值,其值由枚举中对应的成员定义。在C#中,枚举类型非常有用,可以用于代替魔术数字和常量字符串。 如何定义一个枚举? 可以使用enum关键字来定义一个枚举数据类型。下面是定义一个示例的代码: enum Color { Red, Green, Blue }…

    C# 2023年5月31日
    00
  • c#使用dynamic类型优化反射的方法

    下面是详细讲解“c#使用dynamic类型优化反射的方法”的完整攻略。 1. 前言 在C#中,使用反射可以在运行时动态地获取类型信息并对这些类型进行操作,是一种强大的编程工具。但反射也有一定的缺点,使用反射访问和操作类型的性能相对较低,尤其是当需求需要重复调用反射代码时,这种性能劣势就更加明显。因此,为了更好地优化反射操作的性能,C#提供了一种dynamic…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部