浅谈谁都能看懂的单点登录(SSO)实现方式(附源码)
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-ServerSSO-Server主要负责用户登录、注销、为SSO-Client分配taken、验证taken的工作。登录和注销采用的是Form认证方式,很多地方都有详细的介绍。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-ClientSSO-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 + "退出"; } 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.com2. 在hosts文件中添加两行映射,将sso-server.com和sso-client.com映射到127.0.0.1,确保可以访问3.访问sso-client.com,这个时候页面将跳转到sso-server.com的登录页面,用户名、密码随便输入,然后点击登录即可
单点登录 SSO
但随着企业的发展,用到的系统随之增多,用户在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于用户来说,很不方便。于是,就想到是不是可以在一个系统登录,其他系统就不用登录了呢?这就是单点登录要解决的问题。比如 淘宝,支付宝,天猫商城等都使用单点登录,同一个账号可以登录多个系统。
单点登录英文全称Single Sign On,简称就是SSO。是比较流行的企业业务整合的解决方案之一。 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
基础模式 SSO 访问流程主要有以下步骤:
登录后设置的 Cookie,之后每次访问时都会携带该 Cookie,从而让后台服务能识别当前登录用户。Cookie过期重新登录 如果是同域下系统登录,依旧可以使用此方式进行登录
具体流程如下:
具体流程如下:
用户登出时要做的事情很简单:
ST ( Service Ticket )是通过 Http 传送的,因此网络中的其他人可以 Sniffer 到其他人的 Ticket 。 CAS 通过以下几方面来使 ST 变得更加安全(事实上都是可以配置的):
CAS 协议规定,无论 Service Ticket 验证是否成功, CAS Server 都会清除服务端缓存中的该Ticket ,从而可以确保一个 Service Ticket 不被使用两次。 2. ST 在一段时间内失效 CAS 规定 ST 只能存活一定的时间,然后 CAS Server 会让它失效。默认有效时间为 5 分钟。 3. ST 是基于随机数生成的 ST 必须足够随机,如果 ST 生成规则被猜出, Hacker 就等于绕过 CAS 认证,直接访问 对应的服务。

