单点登录SSO如何实现
导读:本文共2885.5字符,通常情况下阅读需要10分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: SSO的基本概念SSO英文全称Single Sign On(单点登录)。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。二级域名的单点登录什么是二级域名呢?例如:site1.domain.comsite2.domain... ...
目录
(为您整理了一些要点),点击可以直达。SSO的基本概念
SSO英文全称Single Sign On(单点登录)。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。
二级域名的单点登录
什么是二级域名呢?例如:
site1.domain.com
site2.domain.com
对于二级域名的单点登录,我们可以非常方便的通过共享cookie来实现,简单的说,就是在设置Form票据的时候,将cookie的domain设置为顶级域名即可,例如:
HttpCookiecookie=newHttpCookie(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认证方式,很多地方都有详细的介绍。
SSO-Server分配Token
为SSO-Client分配Token的部分,在SSO-Client请求SSO受信页面的时候,检查SSO-Server是否登录,如果没有登录则跳转到SSO-Server的登录页面,如果已登录,则执行分配Token的代码,在分配完成以后将TokenID作为参数添加到returnUrl中,并跳转到returnUrl,具体的分配代码如下:
if(Domain.Security.SmartAuthenticate.LoginUser!=null){//生成Token,并持久化TokenDomain.SSO.Entity.SSOTokentoken=newEntity.SSOToken();token.User=newEntity.SSOUser();token.User.UserName=Domain.Security.SmartAuthenticate.LoginUser.UserName;token.LoginID=Session.SessionID;Domain.SSO.Entity.SSOToken.SSOTokenList.Add(token);//拼接返回的url,参数中带Tokenstringspliter=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]publicEntity.SSOTokenValidateToken(stringtokenID){if(!KeepToken(tokenID))returnnull;vartoken=Domain.SSO.Entity.SSOToken.SSOTokenList.Find(m=>m.ID==tokenID);returntoken;}[WebMethod]publicboolKeepToken(stringtokenID){vartoken=Domain.SSO.Entity.SSOToken.SSOTokenList.Find(m=>m.ID==tokenID);if(token==null)returnfalse;if(token.IsTimeOut())returnfalse;token.AuthTime=DateTime.Now;returntrue;}
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.AuthTokenServiceSoapClientclient=newAuthTokenService.AuthTokenServiceSoapClient();vartoken=client.ValidateToken(tokenID);if(token!=null){this.lblMessage.Text="登录成功,登录用户:"+token.User.UserName+"<ahref='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"));}
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
单点登录SSO如何实现的详细内容,希望对您有所帮助,信息来源于网络。