zoukankan      html  css  js  c++  java
  • AspNetCore中基于Session的身份验证

    AspNetCore中基于Session的身份验证

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

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

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

    基于Session的身份验证实现

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

    实现原理

    1. 客户端发送身份认证数据到服务器端
    2. 服务器收到并验证后将用户信息保存到Session对象中,然后生成对应的标识并将标识写入cookie中
    3. 当客户端下次请求时带上该cookie标识
    4. 服务器通过该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洗洗睡吧!

  • 相关阅读:
    使用 BenchmarkDotnet 测试代码性能
    【UWP】对 Thickness 类型属性进行动画
    【Win10】单元测试中捕获异步方法的指定异常
    【Win10】让 TextBlock 按字符换行
    全国天气预报信息数据 API 功能简介与代码调用实战视频
    5行代码实现微信小程序图片上传与腾讯免费5G存储空间的使用
    获取任意链接文章正文 API 功能简介
    开放数据接口 API 简介与使用场景、调用方法
    程序员如何开始做一个自己的 Side Project?
    VSCode 必装的 10 个高效开发插件
  • 原文地址:https://www.cnblogs.com/guodf/p/9657348.html
Copyright © 2011-2022 走看看