關於提供第三方介面一鍵登入
阿新 • • 發佈:2020-09-11
有時候需要對接第三方系統,通過資料同步的手段實現一鍵登入功能,比如學校學生管理網站遷入到教育局官網/ 校園網站,這些不同網站之間實現使用者共享,即從A平臺可以跳轉到B平臺, 實現自動登入的機制,對於系統而言,提供一個第三方登入的介面,對映到外網,然後根據雙方約定的加密方式,進行引數的一系列解密,解析,驗證,通過後最後跳轉到系統中,不通過則跳轉到友好介面。
publicActionResult CypressLogin(stringencryp)
{
try
{
if(string.IsNullOrEmpty(encryp)) { return RedirectToAction("Err_500Param", "Index", new { Content = "引數找不到" }); } //解密引數 3DES幫助類 var encry = DESHelper.DESDecrypt(encryp, Confighelper.GetValue("CryKey"));if (encry == "引數有誤") { return RedirectToAction("Err_500Param", "Index", new { Content = encry }); } //解析引數-構造引數類實體 var desAry = encry.Split('*'); var desModel = ParamHelper.GetModel<CryParamsModel>(desAry);//判斷引數值是否為null,反射實體所在欄位 Type type = desModel.GetType(); PropertyInfo[] props = type.GetProperties(); var val = props.Where(c => c.GetValue(desModel).ToStr() == string.Empty).Select(c => "引數: " + c.Name + "不能為Null").FirstOrDefault(); if (val != null) { return RedirectToAction("Err_500Param", "Index", new { Content = val }); } //判斷請求是否過期(保證請求時間在1分鐘內) var t1 = new TimeSpan(long.Parse(desModel.Time)); var t2 = new TimeSpan(DateTime.Now.Ticks); if (Math.Abs(t1.Subtract(t2).Minutes) != 0 && Math.Abs(t1.Subtract(t2).Minutes) != 1) { return RedirectToAction("Err_500Param", "Index", new { Content = "請求時間已過期" }); } //驗證使用者是否正確,資料庫檢索使用者資訊 var res = userbll.EryLogin(desModel.uType, desModel.NO); if (res.UserCode == "") { return RedirectToAction("Err_500Param", "Index", new { Content = "使用者名稱和賬號不匹配" }); }
//注入使用者快取
//... ...
//跳轉指定路徑 return Redirect("/Admin/Index/MasterIndex"); } catch (Exception ex) { return RedirectToAction("Err_500Param", "Index", new { Content = "請求失敗,引數異常" }); } }
其中,對於解密後的字串引數,多數帶有一些分隔符號,這裡用一個通用方法中進行處理,最後序列化為實體物件,供方便使用
public static T GetModel<T>(string[] aryParam, char type = '=') { try { var dic = new Dictionary<string, string>(); foreach (string s in aryParam) { var pair = s.Split(type); var name = pair[0]; var value = pair.Length > 1 ? pair[1] : string.Empty; dic.Add(name, value); } var json = JsonConvert.SerializeObject(dic); return JsonConvert.DeserializeObject<T>(json); } catch (Exception) { return default(T); } }
總體而言,一個是解析,一個驗證,同時做好友好介面的跳轉,這裡看上去沒什麼技術含量,流程上也沒有什麼精妙的設計,權當做個記錄,指不定哪天靈光一閃,便有更好的思路