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日

相关文章

  • ASP实现加法验证码

    实现加法验证码的过程可以分为以下几个步骤: 步骤一:生成加法算式 我们需要在服务器端生成一道简单的加法算式作为验证码,同时将其保存在会话(session)中,方便后续验证操作的进行。代码片段如下: <% Dim num1, num2, code Randomize ‘初始化随机数生成器 num1 = Int(Rnd() * 10) ‘生成0~9之间的随…

    C# 2023年6月1日
    00
  • c#检测文本文件编码的方法

    C#中检测文本文件编码的方法主要有以下几种: 1. 使用System.Text.Encoding的GetEncoding方法 使用System.Text.Encoding的GetEncoding方法可以检测文本文件的编码类型。该方法会返回一个Encoding类型的对象,用来表示文件的编码。 以下是一个示例代码: using System.IO; using …

    C# 2023年6月1日
    00
  • C#聊天程序服务端与客户端完整实例代码

    下面我将为您详细讲解“C#聊天程序服务端与客户端完整实例代码”的完整攻略。 关于“C#聊天程序服务端与客户端完整实例代码” 这是一篇介绍如何使用C#语言实现聊天程序的完整攻略。其中包括服务端和客户端的完整代码。 服务端使用C#语言实现,使用TCP协议进行通信。并且,服务端为多线程模型,能够同时处理多个客户端连接请求。 客户端使用C#语言实现,可以与服务端建立…

    C# 2023年6月7日
    00
  • C# 生成随机数的代码

    下面是关于C#生成随机数的完整攻略: 1. C#中生成随机数的方法 C#中生成随机数可以使用System.Random类来实现。该类使用默认的种子值生成随机数,也可以指定种子值来生成不同的随机序列。常用的方法有Next()、NextDouble()和NextBytes(byte[] buffer)方法,具体用法如下: 1.1 Next()方法: Next()…

    C# 2023年5月31日
    00
  • C#对象为Null模式(Null Object Pattern)实例教程

    C#对象为Null模式(Null Object Pattern)实例教程 介绍 在C#中,经常需要处理对象是否为null的情况。在编写代码时,我们通常会使用”if(null)”这样的条件语句进行处理。然而,这种处理方式复杂度较高,容易出错。通过Null Object Pattern模式,我们可以将对象的null值进行抽象化,简化代码编写。 实现 方案一:使用…

    C# 2023年5月31日
    00
  • Base64编码解码原理及C#编程实例

    Base64编码是将二进制数据转换成可打印字符的编码方式,该编码方式需要使用64个可打印字符,即A-Z,a-z,0-9,+和/。 在Base64编码中,每个字符占用6个比特位,因此一个字节可以转换成两个Base64字符。其编码原理是将3个8位的二进制数据(即24个比特位)按照顺序依次作为高位到低位排列成4个6位的比特位组(即4个6位的二进制数据),转换成4个…

    C# 2023年6月6日
    00
  • C#实现移除字符串末尾指定字符的方法

    下面是C#实现移除字符串末尾指定字符的方法的完整攻略。 方法一:使用Substring方法 C#中的String类中提供了Substring方法,该方法可以从一个字符串中截取出指定位置的子字符串。利用此特性,可以实现移除字符串末尾指定字符的功能。 具体步骤如下: 判断字符串末尾是否是指定字符 使用String类中的EndsWith方法来判断字符串末尾是否是指…

    C# 2023年6月8日
    00
  • 总结ASP.NET C#中经常用到的13个JS脚本代码

    下面是“总结ASP.NET C#中经常用到的13个JS脚本代码”的详细攻略。 1. 执行JS代码 我们可以使用JS的eval()方法执行一段JS代码,其用法如下: eval(‘console.log("Hello World!")’); 2. 显示或隐藏元素 如果我们想要在点击某个元素时显示或隐藏一个元素,我们可以使用以下代码: func…

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