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"");
原文地址:https://www.cnblogs.com/onesea/p/13794171.html