赵潇潇
AspNetCore中基于Session的身份验证
来源:张爱华     发布时间: 2019-04-22      浏览次数:294

字号:

目录

AspNetCore中基于Session的身份验证基于Session的身份验证实现Asp.Net Core中的Session身份认证实现源代码总结

AspNetCore中基于Session的身份验证

在Asp.Net框架中提供了几种身份验证方式:Windows身份验证、Forms身份验证、passport身份验证(单点登录验证)。

每种验证方式都有适合它的场景:

    Windowss身份验证通常用于企业内部环境,Windows Active Directory就是基于windows平台的身份验证实现;Forms身份验证是Asp.Net框架中提出的另一种验证方式;passport身份验证是微软提供的基于自己的lives账号实现的单点认证服务。

基于Session的身份验证实现

​ 这种方式可能是在Asp.Net框架提供的几种验证方式之外的最常用的身份验证方式。

实现原理

    客户端发送身份认证数据到服务器端服务器收到并验证后将用户信息保存到Session对象中,然后生成对应的标识并将标识写入cookie中当客户端下次请求时带上该cookie标识服务器通过该cookie标识从session对象中获取对应的用户信息

Asp.Net Core中的Session身份认证实现

​ 基于Session的身份认证并不是Asp.Net Core中推荐的认证方式,因为Asp.Net Core中有更高级的Forms身份认证方式,不过在这里不是本文章的主题,我们只讲如何在Asp.Net Core中实现基于Session的身份认证。

我们先创建一个用于代码演示的基础项目

dotnet new razor -n SessionSample

startup.cs中启用session功能

public class Startup{ public void ConfigureServices(IServiceCollection services) { ... //添加session服务 services.AddSession(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { ... //启用session app.UseSession(); app.UseMvc(); }}

创建一个MyPage.cs文件,我们在该类中实现了一个IsLogin属性,该属性用来判断用户的登陆状态:

public class MyPage:PageModel{ protected bool IsLogin { get { string userId = null; //从sessin中获取UserId对应的用户信息来判断用户是否登陆 if (HttpContext.Session.TryGetValue("UserId", out byte[] bytes)) { userId = Encoding.UTF8.GetString(bytes); } return !string.IsNullOrWhiteSpace(userId); } }}

我们已经实现了验证,现在缺少的是如何在session中添加UserId的信息,我们来创建一个Login页面

dotnet new page -n Login

public class LoginModel : MyPage{ public void OnGet() { if(IsLogin) { //如果已经登陆就跳转到/Index页面 RedirectToPage("/Index"); } } public IActionResult OnPost() { //这里我们将UserId写入session中 HttpContext.Session.SetString("UserId", Guid.NewGuid().ToString()); return RedirectToPage("/Index"); }}

给现有的页面添加验证功能,打开Index页面,添加如下代码:

public class IndexModel : MyPage{ public IActionResult OnGet() { if (!IsLogin) { return RedirectToPage("/Login"); } return Page(); }}

OK!我们已经实现了身份认证。

源代码

总结

​ 我们描述了传统Asp.Net中提供的几种身份认证方式,并在Asp.Net Core实现了一种虽然不标准但是常用的身份认证机,看起了与Asp.Net中的用法并没有什么区别。

​ 在Asp.Net Core中这种用法似乎并不受欢迎,可能是因为Asp.Net Core提供了更高级的身份验证机制吧,那么这篇文章存在的意义呢?权当做是对Asp.Net的一种纪念吧!

​ 现在是.net core的时代,让.net洗洗睡吧!

  • 相关内容: