首页 > 编程语言 >谁都能看懂的单点登录(SSO)实现方式(附源码)

谁都能看懂的单点登录(SSO)实现方式(附源码)

时间:2023-12-15 19:02:12浏览次数:30  
标签:单点 登录 token Server SSO 源码 Client com

SSO的基本概念

SSO英文全称Single Sign On(单点登录)。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。(本段内容来自百度百科)

今天这篇文章将介绍SSO的一种实现方式,代码超简单,仅用来验证我的思路是否可行,具体细节请大家来完善!

二级域名的单点登录

什么是二级域名呢?例如:

·        site1.domain.com

·        site2.domain.com

对于二级域名的单点登录,我们可以非常方便的通过共享cookie来实现,简单的说,就是在设置Form票据的时候,将cookie的domain设置为顶级域名即可,例如:

HttpCookie cookie = new HttpCookie(FormsAuthCookieName, encryptedTicket);
cookie.Expires = rememberMe ? expirationDate : DateTime.MinValue;
cookie.HttpOnly = true;
cookie.Path = "/";
cookie.Domain = "domain.com";
context.Response.Cookies.Set(cookie);

这种方式不涉及跨域,当cookie的domain属性设置为顶级域名之后,所有的二级域名都可以访问到身份验证的cookie,在服务器端只要验证了这个cookie就可以实现身份的验证。

但是,当跨域的时候,例如:

·        site1.com

·        site2.com

这个时候就不能共享cookie了,所以上面的解决方案就会失效。那么,要实现跨域的单点登录该如何做呢?请继续往下看。

跨域的单点登录

关于跨域的SSO的设计思路,我画了一个简单的流程图:

首先,我将跨域的SSO分为SSO-Server和SSO-Client两个部分,SSO-Client可以是多个的。

SSO-Server

SSO-Server主要负责用户登录、注销、为SSO-Client分配taken、验证taken的工作。

登录和注销采用的是Form认证方式,很多地方都有详细的介绍,我之前也写过一篇文章,想了解的可以去看看:asp.net Forms身份验证详解

SSO-Server分配Token

为SSO-Client分配Token的部分,在SSO-Client请求SSO受信页面的时候,检查SSO-Server是否登录,如果没有登录则跳转到SSO-Server的登录页面,如果已登录,则执行分配Token的代码,在分配完成以后将TokenID作为参数添加到returnUrl中,并跳转到returnUrl,具体的分配代码如下:

if (Domain.Security.SmartAuthenticate.LoginUser != null)
{
//生成Token,并持久化Token
Domain.SSO.Entity.SSOToken token = new Entity.SSOToken();
token.User = new Entity.SSOUser();
token.User.UserName = Domain.Security.SmartAuthenticate.LoginUser.UserName;
token.LoginID = Session.SessionID;
Domain.SSO.Entity.SSOToken.SSOTokenList.Add(token);
//拼接返回的url,参数中带Token
string spliter = returnUrl.Contains('?') ? "&" : "?";
returnUrl = returnUrl + spliter + "token=" + token.ID;
Response.Redirect(returnUrl);
}

当完成Token分配之后,页面将带有TokenID的参数跳转到SSO-Client页面,并在SSO-Client的Cookie中添加Token值,在以后的每次请求中,SSO-Client通过调用SSO-Server的服务来验证Token的合法性。

SSO-Server验证Token

我是通过WebService来验证Token的。

首先在SSO-Server定义一个Web Service:

[WebMethod]public Entity.SSOToken ValidateToken(string tokenID)
{
if (!KeepToken(tokenID))
return null;
var token = Domain.SSO.Entity.SSOToken.SSOTokenList.Find(m => m.ID == tokenID);
return token;
}
[WebMethod]public bool KeepToken(string tokenID)
{
var token = Domain.SSO.Entity.SSOToken.SSOTokenList.Find(m => m.ID == tokenID);
if (token == null)
return false;
if (token.IsTimeOut())
return false;
token.AuthTime = DateTime.Now;
return true;
}

ValidateToken用来验证TokenID的合法性,KeepToken用来保持Token不会过期。

SSO-Client通过调用Validate验证Token,并得到当前的登录用户信息。接下来看看SSO-Client的实现。

SSO-Client

SSO-Client作为受信系统来存在的,它自己没有认证系统,只能通过SSO-Server来完成用户身份认证的工作。

当用户请求SSO-Client的受保护资源时,SSO-Client会首先是否有TokenID,如果存在TokenID,则调用SSO-Server的WebService来验证这个TokenID是否合法;

验证成功以后将会返回SSOToken的实例,里面包含已登录的用户信息。具体代码如下:

if (!string.IsNullOrEmpty(tokenID))
{
AuthTokenService.AuthTokenServiceSoapClient client = new AuthTokenService.AuthTokenServiceSoapClient();
var token = client.ValidateToken(tokenID);
if (token != null)
{
this.lblMessage.Text = "登录成功,登录用户:"
+ token.User.UserName
+ "<a href='http://sso-server.com/logout.aspx?returnUrl="
+ Server.UrlEncode("http://sso-client.com")
+ "'>退出</a>";
}
else
{
Response.Redirect("http://sso-server.com/sso.aspx?returnUrl=" +
Server.UrlEncode("http://sso-client.com/default.aspx"));
}
}else{
Response.Redirect("http://sso-server.com/sso.aspx?returnUrl=" +
Server.UrlEncode("http://sso-client.com/default.aspx"));
}

源代码

文章中已经介绍了我的具体思路和一些实现,如果你仍然感兴趣,可以下载我的代码>>Demo.SSO

源代码的部署:

1. 在IIS中创建两个站点,分别绑定到SSO-Server和SSO-Client,它们绑定的域名分别是sso-server.com和sso-client.com

2. 在hosts文件中添加两行映射,将sso-server.com和sso-client.com映射到127.0.0.1,确保可以访问

3.访问sso-client.com,这个时候页面将跳转到sso-server.com的登录页面,用户名、密码随便输入,然后点击登录即可


 

标签:单点,登录,token,Server,SSO,源码,Client,com
From: https://blog.51cto.com/u_16398598/8843683

相关文章

  • 打赏源码|视频打赏源码h5附搭建教程
     在互联网时代,视频成为了人们获取信息和娱乐的主要方式之一。而随着内容创作者的崛起,视频平台也逐渐成为了他们展示才华和创作成果的舞台。然而,仅仅创作优质的内容并不足以维持创作者的持续创作热情和生活稳定。因此,视频打赏源码的出现,为内容创作者提供了一个重要的价值变现途径......
  • AnnotationProcessor版本问题
    java:来自注释处理程序'lombok.launch.AnnotationProcessorHider$ClaimingProcessor'的受支持source版本'RELEASE_8'低于-source'17'解法如果你在使用IntelliJIDEA,并且遇到这个问题,你可以尝试使用提供的临时解决方案。这个方法是在IDE的编译器设置中添加一个VM选......
  • netty源码:(1)NioEventLoopGroup
    EventLoopGroupbossGroup=newNioEventLoopGroup();不加参数创建NioEventLoopGroup的话,会使用cpu核数*2作为bossGroup的线程数。......
  • Java云架构、云服务、云运维的医院信息管理系统源码(云HIS)
    医院信息系统(HIS)经历了从手工到单机再到局域网的两个阶段,随着云计算、大数据新技术迅猛发展,基于云计算的医院信息系统将逐步取代传统局域网HIS,以适应人们对医疗卫生服务越来越高的要求。利用云计算、大数据等现代信息技术研发的医疗卫生信息平台(HIP)实现了医院信息化从局域网向互......
  • springboot032 图书馆管理系统-计算机毕业设计源码+LW文档
    摘 要随着社会的发展,计算机的优势和普及使得阿博图书馆管理系统的开发成为必需。阿博图书馆管理系统主要是借助计算机,通过对图书借阅等信息进行管理。减少管理员的工作,同时也方便广大用户对所需图书借阅信息的及时查询以及管理。阿博图书馆管理系统的开发过程中,采用B/S架构,主......
  • 影城管理系统-计算机毕业设计源码+LW文档
    摘 要随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多生活之中,随之就产生了“小徐影城管理系统”,这样就让小徐影城管理系统更加方便简单。对于本小徐影城管理系统的设计来说,系统开发主要是采用java语言技术,在整个系统的设计中应用MySQL数据......
  • 学科竞赛管理系统-计算机毕业设计源码+LW文档
    摘要随着国家教育体制的改革,全国各地举办的竞赛活动数目也是逐年增加,面对如此大的数目的竞赛信息,传统竞赛管理方式已经无法满足需求,为了提高效率,竞赛管理系统应运而生。 本学科竞赛管理系统以实际运用为开发背景,基于SpringBoot框架、Vue框架,运用了Java语言和MYSQL数据库进行开......
  • R语言 Lasso系数置信区间计算
    真是神了奇了,还能被审稿人问到Lasso系数的置信区间的信息,还好有现成的工具可以计算 #loadlibrarylibrary(selectiveInference)library(xlsx)library(glmnet)#loaddatasetwd("E:\\UAI_Program\\2-ZhongshanHospital\\12-xiaoyuyao系数置信区间")Data<-read.xlsx("R.xls......
  • 单点登录<四>----satoken
    SSO-Server端:处理所有SSO相关请求http://{host}:{port}/sso/auth --单点登录授权地址,接受参数:redirect=授权重定向地址http://{host}:{port}/sso/doLogin --账号密码登录接口,接受参数:name、pwdhttp://{host}:{port}/sso/checkTicket --Ticket校验接口(isHttp=true时打开),......
  • 拓扑排序软件设计——ToplogicalSort_app(含有源码、需求分析、可行性分析、概要设计、
    @目录前言1.需求分析2.可行性分析2.1简介2.2技术可行性分析2.2.1技术实现方案2.2.2开发人员技能要求2.2.3可行性2.3操作可行性分析2.4结论3.项目报告3.1修订历史记录3.2软硬件环境3.3需求分析3.4详细设计3.4.1类设计3.4.2核心流程描述3.4.3核心算法设计3.5运行......