標籤:ram web ken key index 需要 oca count 配置
一、什麼是單點登入SSO(Single Sign-On)
SSO是一種統一 認知 和授權機制,指訪問用同一伺服器不同應用中的受保護資源的同一使用者,只需登入一次,即通過一個應用中的安全驗證 後,再訪問其他 應用中的受保護資源時,不再需要重新 登入驗證。
註:
1.所有應用 系統共用一個身份認證系統。
2.所有應用系統能夠 識別和提取ticket資訊。
二、實現過程 及原理說明
1.Session_Server項目作為使用者認證系統,其他網站也使用它作為使用者認證
2.對於同一個瀏覽器 的同一次會員,總是帶有相同的 Asp.Net_SessionID,作為ticket憑據,當 用於登入後將這個sessionid標記已經登入,其他系統訪問先判斷sessionid是否登入,如果 是 自動登入
3.對於Session_Server項目的處理,幕後處理登入邏輯配置指定網域名稱可訪問、可帶Cookie資訊,前台Ajax請求需要待著Cookie,不然每次請求都返回不同的sessionid。
三、代碼執行個體:
Git地址 :http://git.oschina.net/tiama3798/WebAPI_Demo
後台:
/// <summary> /// 單點登入,介面封裝 /// </summary> [EnableCors("*", "*", "*")] public class LoginController : BaseController { /// <summary> /// 擷取當前Session的ID /// </summary> /// <returns></returns> [EnableCors("*", "*", "*", SupportsCredentials = true)] public string GetSessionID() { return _Session.SessionID; } LogHelper.LogHelper _log = new LogHelper.LogHelper(); /// <summary> /// 判斷當前回話的使用者是否已經登入 /// </summary> /// <returns></returns> public string GetLogin(string sessionid) { //1.擷取所有Session內容 foreach (var item in _Application.AllKeys) { if (item == sessionid) { AccountInfo acount = _Application[item.ToString()] as AccountInfo; if (acount != null && acount.SessionID == sessionid) { return acount.ToJsonString(); } } } return "0"; } /// <summary> /// 判斷處理使用者登入 /// </summary> /// <param name="username"></param> /// <param name="pwd"></param> /// <returns></returns> public string CheckUser() { string token = ReqHelper.GetString("token"); string username = ReqHelper.GetString("username"); string pwd = ReqHelper.GetString("pwd"); if (pwd == "123") { //登入成功,返回cookie的值 _Application.Add(token, new AccountInfo() { UserName = username, SessionID = token }); return $"username={username}&sessionid={token}"; } return "0"; } /// <summary> /// 登入使用者資訊 /// </summary> public class AccountInfo { public string UserName { get; set; } public string SessionID { get; set; } } }
前台:
/*** 單點登入封裝*/(function () { var urlHelper = { //擷取網域名稱 getDomain: function () { if (location.host.indexOf(‘localhost‘)!=-1) return ‘http://localhost:62087/‘; return ‘http://www.s.com/‘; }, getController: function (controller) { return this.getDomain() + controller; }, getAction: function (controller, action) { var url = this.getDomain(); if (controller) url += controller + ‘/‘; if (action) url += action + ‘/‘; return url; } } var accountOperate = { //1.擷取當前回話id getSessionID: function (successCB) { var _this = this; ////判斷id是否已經存在,如果已經存在不在請求 //$.get(urlHelper.getAction("login", ‘GetSessionID‘), { //}, function (data) { // if (successCB) // successCB(data); // //儲存在本地 // $.cookie(‘_token_‘, data, { path: ‘/‘ }); //}); //因為跨域所以需要待著cookie $.ajax({ url: urlHelper.getAction("login", ‘GetSessionID‘), data: {}, xhrFields: { withCredentials: true //支援附帶詳細資料 }, crossDomain: true,//請求偏向外域 success: function (data) { if (successCB) successCB(data); //儲存在本地 $.cookie(‘_token_‘, data, { path: ‘/‘ }); } }); }, //擷取cookie中的sessionid getToken: function () { return $.cookie(‘_token_‘); }, //判斷token的使用者是否登入 getinfo: function (token, callBack) { var _this = this; if (token) { console.info(urlHelper.getAction("login", ‘GetLogin‘)); $.get(urlHelper.getAction("login", ‘GetLogin‘), { sessionid: token }, function (data) { if (callBack) callBack(data); }); } }, //初始化登入處理 login_init: function (errorCB, sucessCB) { var _this = this; //判斷是否登入 if (_this.getuser()) { } else { //擷取token _this.getSessionID(function (sessionid) { //擷取登入資訊 //alert(sessionid); console.info(sessionid); _this.getinfo(sessionid, function (data) { if (data != 0) { $.cookie(‘user‘, data); } }); }); } }, //判斷使用者是否已經登入 getuser: function () { console.info(this.getToken()); return $.cookie(‘user‘); }, //指定使用者名稱密碼,登入使用者 checkuser: function (username, pwd, sucessCB) { var _this = this; $.post(urlHelper.getAction("login", ‘checkuser‘), { token: _this.getToken(), username: username, pwd: pwd }, function (data) { if (data == ‘0‘) { alert(‘登入失敗‘); //if (callBack) callBack(data); } else { if (sucessCB) sucessCB(data); } }); } } window.account = accountOperate;})();
更多:
Asp.Net WebApi開啟Session回話
Asp.Net WebApi 啟用CORS跨域訪問指定多個網域名稱
Ajax跨域請求中的Cookie問題(預設不帶cookie等憑證)
更多參考:
http://www.cnblogs.com/yupeng/archive/2012/05/24/2517317.html
http://www.cnblogs.com/heyangyi/p/5700644.html
SSO單點登入之Asp.Net實現樣本