HTML5技术

.NET基于Redis缓存实现单点登录SSO的解决方案 - Joye.Net

字号+ 作者:H5之家 来源:H5之家 2016-04-20 15:00 我要评论( )

一、基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享。 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是

一、基本概念

最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享。

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

普通的登录是写入session,每次获取session看看是否有登录就可记录用户的登录状态。

同理多个站点用一个凭证,可以用分布式session,我们可以用redis实现分布式session,来实现一个简单的统一登录demo

我们在本地IIS建立三个站点

 登录验证的站点

站点1

站点2

修改host文件C:\Windows\System32\drivers\etc下

127.0.0.1

127.0.0.1 test1.a.com

127.0.0.1 test2.a.com

127.0.0.1 sso.a.com

具体实现原理,当用户第一次访问应用系统test1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统test2和应用系统test3了。

项目结构

二、代码实现

sso.a.com登录验证站点

SSO demo 用 户: 密 码:

代码:

Index : System.Web.UI.Page { StrTip { get; set; } public string UserName { get; set; } public string PassWork { get; set; } protected void Page_Load(object sender, EventArgs e) { if (Page.IsPostBack) { ValidateUser(); } } ValidateUser() { ]; if (username.Equals("")) { StrTip = ; return; } ]; if (password.Equals("")) { StrTip = ; return; } (username == && password == ) { UserInfo userInfo=new UserInfo() { UserName = ,PassWord = ,Info = }; token = Guid.NewGuid().ToString(); //写入token Common.Common.AddCookie(, token, Int32.Parse(ConfigurationManager.AppSettings[])); //写入凭证 RedisClient client = ], 6379); client.Set<UserInfo>(token, userInfo); (Request.QueryString[] != null) { Response.Redirect(Request.QueryString[].Decrypt(), false); } else { Response.Redirect(ConfigurationManager.AppSettings[], false); } } else { StrTip = ; return; } } }

配置文件:

注销代码:

); Common.Common.AddCookie(,tokenValue,-1); HttpContext.Current.Response.Redirect(ConfigurationManager.AppSettings[]);

其他站点验证是否登录的代码:PassportService

public class PassportService { TokenReplace() { string strHost = HttpContext.Current.Request.Url.Host; string strPort = HttpContext.Current.Request.Url.Port.ToString(); , strHost, strPort, HttpContext.Current.Request.RawUrl); url = Regex.Replace(url, , "", RegexOptions.IgnoreCase); ] + + url.Encrypt(); } public void Run() { ); RedisClient client = ], 6379); UserInfo userInfo = client.Get<UserInfo>(token); if (userInfo == null) { Common.Common.AddCookie(, token, -1); //令牌错误,重新登录 HttpContext.Current.Response.Redirect(TokenReplace(), false); } else { Common.Common.AddCookie(, token, Int32.Parse(ConfigurationManager.AppSettings[])); } } public UserInfo GetUserInfo() { ); RedisClient client = ], 6379); return client.Get<UserInfo>(token) ?? new UserInfo(); } }

三、最后看下效果图

四、代码下载

这里只做了一个简单的实现,提供了一个简单的思路,具体用的时候可以继续完善。

代码下载:

https://yunpan.cn/cPAtDehnv8bXr (提取码:1a4a)

 

五、加关注

如果本文对你有帮助,请点击【右下角推荐】和【左上角关注】

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Dora.Interception: 一个为.NET Core度身定制的AOP框架 - Artech

    Dora.Interception: 一个为.NET Core度身定制的AOP框架 - Artech

    2017-05-02 11:00

  • 如何在 ASP.NET Core 中发送邮件 - Savorboard

    如何在 ASP.NET Core 中发送邮件 - Savorboard

    2017-05-02 08:02

  • 十二个 ASP.NET Core 例子 - Savorboard

    十二个 ASP.NET Core 例子 - Savorboard

    2017-04-27 16:01

  • ASP.NET MVC5请求管道和生命周期 - 雪飞鸿

    ASP.NET MVC5请求管道和生命周期 - 雪飞鸿

    2017-04-24 08:04

网友点评
l