url单点漫游认证
url单点漫游认证模式说明
应用场景
- url单点漫游采用url加密参数验证握手方式,需要接入系统实现url单点漫游参数的接收、验证,以及验证通过后的握手登录。
- 特点:原理及实现较为简单、支持各种开发语言web系统(可提供JAVA、.NET、ASP、PHP等示例说明)、支持用户对照
- 接入条件:接入系统需要实现url单点漫游验证登录。
- 应用场景:接入系统愿意作一定的开发调试工作。
接入方式
- 用户在平台登录后,点击业务系统单点登录的链接后进入该系统,该系统读取平台单点漫游url参数,并使用密钥解密后还原出来用户帐号,时间戳,判断用户信息。
- 平台端与业务系统端共同约定五个参数:
userName //业务系统用户帐号
strSysDatetime//时间戳
verify//校验码
url//访问业务系统的某个地址
pt_key//为双方约定的密钥,通常采用字符串方式
- 由平台端直接访问业务系统时,需要在url中加入四个参数值传递给业务系统。其中verify由userName、strSysDatetime、pt_key(pt_key为双方约定的密钥,通常采用字符串方式)组成并采用md5方式加密形成的最终的一个串值。
- 业务系统获取各个参数后,首先比较业务系统服务器时间同传递过来的strSysDatetime是否在允许的时间差范围内(注意双方服务器时间需保持标准时间),若在时间差范围内,则需将userName、strSysDatetime、pt_key 进行加密后同verify进行比较,若一致,则可以正常登录。
补充说明
- 流程及判断规则:由主平台服务器向业务系统传递参数;
- 公共密钥:双方共同约定,可以是一个字符串。
- 加密解密方式:采用MD5的加密算法,校验判断同时加入时间戳判断,时间戳通常计算为从1970年1月1日午夜起至现在的时间差,用秒表示。
代码部分,可参考cas4.2.7添加新页面
controller代码(部分)
- 注意!由于登录后session销毁,故不能使用session保存信息,本例采用从登录日志获取用户名的方法
@Controller
public class UrlSSOController extends AbstractUrlViewController {
private final DataSource dataSource;
private final JdbcTemplate jdbcTemplate;
@Autowired
public UrlSSOController(@Qualifier("dataSource")
final DataSource dataSource) {
this.dataSource = dataSource;
jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
protected String getViewNameForRequest(HttpServletRequest request) {
String appid = request.getParameter("appid");
String url = request.getParameter("url");
//获取用户名,因为session会被销毁,无法存储信息,故根据ip从登录日志中查找
String ip = getRemoteAddr(request);
CsUserLogin csUserLogin = getUserLogin(ip);
String userName = csUserLogin.getLoginName();
//获取ptKey
List<CsWebappNode> webappNodeList = getWebapp(appid);
String ptKey = webappNodeList.get(0).getAppSecret();
//获取系统时间
String strSysDatetime = DateUtils.getDateTime();
//获取MD5,明文为appID+userName+ptKey+sysDatetime
String md5Info = userName+ptKey+strSysDatetime;
MD5Util md5Util = MD5Util.getInstance();
String md5 = md5Util.calcMD5(md5Info);
String returnUrl ="";
try {
String params = "userName="+userName+"&strSysDatetime="+URLEncoder.encode(strSysDatetime, "utf-8")+"&verify="+md5;
if (url.contains("?")){
returnUrl = url+params;
}else{
returnUrl = url+"?"+params;
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "redirect:"+returnUrl;
}
}