SSO 登录功能的实现
一、引言
自己早晚都会碰到的问题。
当需要到分离多站点多应用的时候,都是希望用户只要在一个站点登录,其它所有的应用站点都是已登录的状态。
查了下新浪与淘宝的登录的资料,自己实现了一个并做下记录。
二、思路
1.当用户在各个站点点击需要登录认证的页面时,都会跳转到认证服务器(SSO Server)的登录页面。
2.用户在SSO Server进行登录操作并成功时,在SSO Server写入Cookie。
3.SSO Server生成一个Ticket发送给应用服务器。
4.应用服务器写好一个用于接受SSO Server发送过来的Ticket的登录方法。
5.应用服务器根据Ticket将登录Cookie写入到应用服务器里。
三、实现
1.做好认证服务器的登录功能。
2.用户在认证服务器登录成功时:
2.1.情况一:跳转至成功页面,该页面引入一个JS文件,该文件的地址是应用服务器的登录地址。
在这里使用JS来加载登录地址是可以动态调用应用服务器的登录地址的。
例:
1
|
<script src= "http://b.com/user/login?ticket=dasfdslafjlsdaflsdfj" ></script> |
2.2.情况二:使用 AJAX 来处理时,在登录成功后自动跳转前,动态加载 JS 文件即可。JS文件的地址同样是应用服务器的登录地址。
例:
success: function (data) { document.write("<script src='" + data.Ticket + "'><\/script>"); //登录成功时,跳转到到指定页面。 window.location.href = resultUrl; }
3.在应用服务器写上一个登录方法,该方法用于接受认证服务器发送过来的 Ticket,认证成功时写入应用服务器站点的 Cookie。
我自己使用的方法是:
1.认证服务器登录成功后,对用户账号进行加密,将加然后的字符串做为 ticket 发送给应用服务器。
2.应用服务器接受到 ticket 后对它进行解密,并对自己的用户权限系统进行登录认证,认证成功则写入 Cookie.
3.应用服务器的登录页面要加上P3P,否则会有安全问题无法写入 Cookie。
this.Response.AddHeader("P3P", "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"");