首页  ·  知识 ·  编程语言
ASP.NET使用Redis实现单点登录
aojiancc2  tnblog  .NET  编辑:时倾   图片来源:网络
session是用来记录客户端用户信息的,在客户端第一次向服务器发起请求的时候服务器会生成一个sessionid并返回。客户端接收到seesion存放到cookie中,下次在请求的时候会携带sessionid用于区别不

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或者命令运行都行

image.png

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


nuget中执行命令下载依赖

 install-package  Microsoft.Web.RedisSessionStateProvider  -version 2.2.6

然后WebApi中加入配置

image.png


项目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完全一致从而可以实现跨项目单点登录


tip:这里可以看到两个项目的sessionid都一样,为什么会这样呢?我估计是第一个项目访问的时候分配了sessionid,然后存储到了redis把,

第二个项目访问的时候分配的sessionid就直接从redis中去取了,从而实现能取到值


本文作者:aojiancc2 来源:tnblog
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读