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日

相关文章

  • [翻译]ExecutionContext vs SynchronizationContext

    我最近几次被问到关于 ExecutionContext 和 SynchronizationContext 的各种问题,例如它们之间的区别是什么,“传播(Flow)”它们意味着什么,以及它们与 C# 和 Visual Basic 中新的 async/await 关键字的关系。我想我会尝试在这里解决其中的一些问题。 警告:这篇文章深入到 .NET 的一个高级领域…

    C# 2023年4月17日
    00
  • C#使用Newtonsoft.Json中的JObject对象

    当我们需要在C#应用程序中处理JSON数据时,可以使用Newtonsoft.Json库。该库提供了许多用于处理JSON数据的类和方法,其中一个非常有用的类是JObject。 JObject类表示一个JSON对象,它的属性通常是一个或多个JToken对象。以下是使用JObject操作JSON数据的完整攻略。 步骤1:导入Newtonsoft.Json库 首先,…

    C# 2023年5月31日
    00
  • Question:基于C#连续赋值的面试题(解答)

    以下是对“Question:基于C#连续赋值的面试题(解答)”的完整攻略。 问题描述 这个问题描述如下: int i = 1; i = i++ + ++i; 问题解析 这道题主要考察的是 C# 连续赋值的知识点和自增运算符的使用。 连续赋值 先解释一下什么是连续赋值。连续赋值就是我们在一行语句中多次对一个变量进行赋值操作,如下所示: int i; i = 1…

    C# 2023年6月7日
    00
  • Java如何基于wsimport调用wcf接口

    Java如何基于wsimport调用WCF接口 WCF(Windows Communication Foundation)是一种用于构建分布式应用程序的技术。Java可以通过wsimport工具来生成WCF服务的客户端代码,并调用WCF接口。本文将详细讲解如何使用Java基于wsimport调用WCF接口,并提供两个示例。 1. 使用wsimport生成WC…

    C# 2023年5月15日
    00
  • Unity C#执行bat脚本的操作

    下面是关于“Unity C#执行bat脚本的操作”的完整攻略: 概述 在Unity使用C#执行bat脚本,是一种在游戏开发过程中调用外部工具的常用方法,其中bat脚本可以实现一些与游戏开发有关的工具或者其他操作。下面将介绍如何在Unity中使用C#执行bat脚本以及提供两个示例说明。 步骤 步骤1:编写bat脚本 在项目目录下新建一个bat脚本文件,比如我们…

    C# 2023年6月3日
    00
  • C#利用System.Uri转URL为绝对地址的方法

    当我们在编写 C# 程序时,有时需要将相对 URL 转为绝对 URL。这时可以利用 System.Uri 类提供的方法来实现。在本篇攻略中,我将详细讲解如何使用 System.Uri 类来将相对 URL 转为绝对 URL 的方法。 步骤一:创建 Uri 对象 使用 System.Uri 类中的 Parse 方法或者构造函数,将相对 URL 转为 Uri 对象…

    C# 2023年6月7日
    00
  • C#泛型委托的用法实例分析

    C#泛型委托的用法实例分析 1. 前言 本文将详细介绍C#中泛型委托的用法,并提供两个实例进行分析,帮助读者理解其使用方法。 2. 什么是泛型委托 在C#中,委托是一种特殊的类型,它定义了一个方法的签名,委托的实例表示的是一个或多个方法的引用。泛型委托则是在委托中使用泛型类型作为参数类型或返回值类型的委托。 泛型委托的定义方式如下: delegate TRe…

    C# 2023年6月7日
    00
  • C# 从Excel读取数据向SQL server写入

    了解如何从Excel读取数据并将其写入SQL Server是一个非常有用的技能。以下是实现此目标的完整攻略: 第一步:引入所需的库 在C#中读取和写入Excel需要使用外部库。我们需要下载并添加以下NuGet包: Microsoft.Office.Interop.Excel:允许操作Excel文件。 Microsoft.ACE.OLEDB.12.0:允许使用…

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