tnblog
首页

ASP.NET 使用Redis实现单点登录

314人阅读 2019/1/9 22:22 评论:2 收藏
分类: .NET


Session介绍


    session是用来记录客户端用户信息的,在客户端第一次向服务器发起请求的时候服务器会生成一个sessionid并返回。

    客户端接收到seesion存放到cookie中,下次在请求的时候会携带sessionid用于区别不同的客户端。

    所以cookie禁用掉,session也有失效。



Asp.Net中Session的存储模式


       1:InProc,Session存储在进程内,默认值

  2:  StateServer,Session存储在独立的状态服务即ASP.NET State Service中

       3:SQLServer,Session存储在SQL Server数据库中

       4:Custom,自定义保存方式,可以保存在MySql、MongoDb、Redis等



Session存入Redis实现单点登录基本原理


    一般我们使用session都是使用的默认的模式就是把session存储在进程内,这个时候如果有用户登录,就向session中取出写入一个数据,然后我们就可以根据这个数据是否存在来判断用户是否登录了,但这种方式无法实现系统A登录了,系统B登录,因为不同的系统session都不一样。所以我们可以把session写入到redis中,然后不同的系统都去取那个redis中的session就可以取出一致的session从而实现单点登录了



先启动Redis


    官网直接下载就好了,双击exe或者命令运行都行

    


 然后创建两个项目,两个项目都加入相关依赖如配置


nuget中执行命令下载依赖

 install-package  Microsoft.Web.RedisSessionStateProvider  -version 2.2.6



然后WebApi中加入配置



项目A创建一个写入session的与或者session的方法

写入session

      public ActionResult Index()
        {
            ViewBag.msg = "访问的A站点" + DateTime.Now.ToString();
 
            //向session写入值
            Session["username"] = "hello" + DateTime.Now.ToString();
 
            return View();
        }


获取session

    public void GetSessionValue()
        {
            if (Session["username"] != null)
            {
                Response.Write("站点A访问session....................<br/>");
                Response.Write("内容:" + Session["username"] + "<br/>");
                Response.Write("SessionId:" + Session.SessionID);
                Response.End();
            }
        }


项目B就创建一个获取session的方法

      public void GetSessionValue()
        {
            if (Session["username"] != null)
            {
                Response.Write("站点B访问session....................<br/>");
                Response.Write("内容:" + Session["username"] + "<br/>");
                Response.Write("SessionId:"+Session.SessionID);
                Response.End();
            }
            else
            {
                Response.Write("session为空");
            }
        }



然后运行测试

先运行项目A写入,然后项目A与项目B都去获取一下session


项目A获取session



项目B获取session


可以看到,虽然项目B没有去写入session但是获取的session却与站点A完全一致从而可以实现跨项目单点登录




请先登录

{{item.title}}

{{item.content}}
不能简单的解决问题,那是设计与做法有问题
博主搜索
文章类别
CSS 5篇
云服务 2篇
Git 4篇
.NET 29篇
Android 0篇
软件架构 4篇
.NET Core 15篇
.NET MVC 3篇
英语 3篇
随笔 3篇
Bootstrap 1篇
Redis 12篇
编辑器 2篇
Js相关 6篇
Layui 2篇
Oracle 7篇
Python 2篇
数据库 2篇
EF 2篇
微信 2篇
前端 1篇
消息队列 1篇
最新文章
为什么要使用webapi而不直接使用controller
net core发布到IIS常见错误
net core依赖注入
NET CORE配置EF连接字符串
Net Core使用依赖注入来装载EF的上下文对象
下载net core
Sqlerver添加用户与授权
net core中使用url编码与解码操作
net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified
.net core使用response
ef6动态添加条件
最新评价
{{item.ArticleTitle}}
{{item.BlogName}} : {{item.Content}}