標籤:winform style blog http color io os ar for
1.什麼情況下會用到單點登入
剛開始架構中也是沒有單點登入此模組的,有一次需要在Winform系統中嵌入Web頁面,整合兩個系統。Web頁面的使用者資訊驗證一直沒找到什麼好的 解決辦法,剛開始的辦法是通過往網頁地址後面自動加上登入使用者名稱和密碼,發送到後台進行登入;這樣也達到了整合的目的,但是總感覺比較彆扭,直接把使用者名稱 和密碼暴露在地址欄肯定存在安全隱患。後來經過一番波折在網上找到類似的解決辦法,利用單點登入的方案達到了比較好的效果;
除了上面說的Winform系統中嵌入Web頁面這種情況,還有經常在自己公司系統中整合一些夥伴的系統,如此打包銷售更有市場競爭力,這樣首要解 決的問題也是登入入口統一;如今行業軟體現狀,不像十年前了只有那麼一兩套系統,講究著用就行了,現在沒有用上十來個系統就不叫資訊化了,所以你能提供一 個單點登入的解決方案也是一大賣點;再就是現在的軟體公司不管大小靠一個產品就能生存的很難了,基本都是最大化的挖掘客戶的需求,最好能提供一整套的解決 方案,這些系統能整體銷售更好,而單個產品銷售也得支援。所以不管是客戶的需求還是內部的產品都會存在系統間整合的問題,而利用單點登入至少能解決使用者統 一驗證的問題;
2.具體代碼
1.登入模組
/// <summary> /// 登入 /// </summary> /// <param name="userId"></param> /// <param name="tokenid"></param> /// <returns></returns> public bool SignIn(string userId, string userName, out Guid tokenid) { TokenInfo existToken = TokenManager.GetToken(userId); //查詢uid是否存在 if (existToken != null) { tokenid = existToken.tokenId; return true; } TokenInfo token = new TokenInfo() { tokenId = Guid.NewGuid(), IsValid = true, CreateTime = DateTime.Now, ActivityTime = DateTime.Now, UserId = userId, UserName = userName }; tokenid = token.tokenId; return TokenManager.AddToken(token);//添加到Tokenlist集合中 }
2.驗證是否存在Token和有效性
//<summary> //是否有效登入 //</summary> //<param name="token"></param> //<returns></returns> public AuthResult ValidateToken(string token) { Guid guid = GetGuid(token, Guid.NewGuid()); //驗證Token合法性 AuthResult result = new AuthResult() { ErrorMsg = "Token不存在" }; TokenInfo existToken = TokenManager.GetToken(guid); //檢查Token是否存在TokenList中 if (existToken != null) { #region 用戶端IP不一致 //if (existToken.RemoteIp != entity.RemoteIp) //{ // result.ErrorMsg = "用戶端IP不一致"; //} #endregion if (existToken.IsValid == false) { double totalSeconds = ((TimeSpan)(DateTime.Now - existToken.ActivityTime)).TotalSeconds; //Token從產生到目前,經曆了多少時間 result.ErrorMsg = "Token經曆了:" + totalSeconds + "\r\nToken已到期:" + existToken.ActivityTime + "\r\n" + "現在時間:" + DateTime.Now.ToLocalTime(); TokenManager.RemoveToken(existToken.tokenId);//移除 } else { result.User = new UserInfo() { UserId = existToken.UserId, UserName = existToken.UserName, CreateDate = existToken.CreateTime }; result.ErrorMsg = string.Empty; } } return result; }
3.Token類中的相關方法
public class TokenManager { private const int _TimerPeriod = 60000;//60秒,這裡設定Token到期時間為60秒 private static Timer thTimer; static List<TokenInfo> tokenList = null; static TokenManager() { tokenList = new List<TokenInfo>(); thTimer = new Timer(_ThreadTimerCallback, null, _TimerPeriod, _TimerPeriod); } private static void _ThreadTimerCallback(Object state) { DateTime now = DateTime.Now; Monitor.Enter(tokenList); try { // Searching for expired users foreach (TokenInfo t in tokenList) { if (((TimeSpan)(now - t.ActivityTime)).TotalMilliseconds > _TimerPeriod) { t.IsValid = false;//失效 } } } finally { Monitor.Exit(tokenList); } } public static bool AddToken(TokenInfo entity) { tokenList.Add(entity); return true; } public static bool RemoveToken(Guid token) { TokenInfo existToken = tokenList.SingleOrDefault(t => t.tokenId == token); if (existToken != null) { tokenList.Remove(existToken); return true; } return false; } public static TokenInfo GetToken(Guid token) { TokenInfo existToken = tokenList.SingleOrDefault(t => t.tokenId == token); return existToken; } public static TokenInfo GetToken(string userId) { TokenInfo existToken = tokenList.SingleOrDefault(t => (t.UserId == userId && t.IsValid == true)); return existToken; } }
以上是核心地方,所以貼出來。 如有問題,請下載源碼 查看詳細!~
C# 單點登入