url單點漫游認證
url單點漫游認證模式說明
應用場景
- url單點漫游采用url加密參數(shù)驗證握手方式洛口,需要接入系統(tǒng)實現(xiàn)url單點漫游參數(shù)的接收稚照、驗證蹂空,以及驗證通過后的握手登錄。
- 特點:原理及實現(xiàn)較為簡單果录、支持各種開發(fā)語言web系統(tǒng)(可提供JAVA上枕、.NET、ASP弱恒、PHP等示例說明)辨萍、支持用戶對照
- 接入條件:接入系統(tǒng)需要實現(xiàn)url單點漫游驗證登錄。
- 應用場景:接入系統(tǒng)愿意作一定的開發(fā)調(diào)試工作返弹。
接入方式
- 用戶在平臺登錄后锈玉,點擊業(yè)務系統(tǒng)單點登錄的鏈接后進入該系統(tǒng),該系統(tǒng)讀取平臺單點漫游url參數(shù)义起,并使用密鑰解密后還原出來用戶帳號拉背,時間戳,判斷用戶信息并扇。
- 平臺端與業(yè)務系統(tǒng)端共同約定五個參數(shù):
userName //業(yè)務系統(tǒng)用戶帳號
strSysDatetime//時間戳
verify//校驗碼
url//訪問業(yè)務系統(tǒng)的某個地址
pt_key//為雙方約定的密鑰去团,通常采用字符串方式
- 由平臺端直接訪問業(yè)務系統(tǒng)時,需要在url中加入四個參數(shù)值傳遞給業(yè)務系統(tǒng)穷蛹。其中verify由userName土陪、strSysDatetime、pt_key(pt_key為雙方約定的密鑰肴熏,通常采用字符串方式)組成并采用md5方式加密形成的最終的一個串值鬼雀。
- 業(yè)務系統(tǒng)獲取各個參數(shù)后,首先比較業(yè)務系統(tǒng)服務器時間同傳遞過來的strSysDatetime是否在允許的時間差范圍內(nèi)(注意雙方服務器時間需保持標準時間)蛙吏,若在時間差范圍內(nèi)源哩,則需將userName、strSysDatetime鸦做、pt_key 進行加密后同verify進行比較励烦,若一致,則可以正常登錄泼诱。
補充說明
- 流程及判斷規(guī)則:由主平臺服務器向業(yè)務系統(tǒng)傳遞參數(shù)坛掠;
- 公共密鑰:雙方共同約定,可以是一個字符串。
- 加密解密方式:采用MD5的加密算法屉栓,校驗判斷同時加入時間戳判斷舷蒲,時間戳通常計算為從1970年1月1日午夜起至現(xiàn)在的時間差,用秒表示友多。
代碼部分牲平,可參考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會被銷毀,無法存儲信息启绰,故根據(jù)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();
//獲取系統(tǒng)時間
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;
}
}