C# 單點登陸

1.什麼狀況下會用到單點登陸

       剛開始框架中也是沒有單點登陸此模塊的,有一次須要在Winform系統中嵌入Web頁面,整合兩個系統。Web頁面的用戶信息驗證一直沒找到什麼好的 解決辦法,剛開始的辦法是經過往網頁地址後面自動加上登陸用戶名和密碼,發送到後臺進行登陸;這樣也達到了整合的目的,可是總感受比較彆扭,直接把用戶名 和密碼暴露在地址欄確定存在安全隱患。後來通過一番波折在網上找到相似的解決辦法,利用單點登陸的方案達到了比較好的效果;安全

       除了上面說的Winform系統中嵌入Web頁面這種狀況,還有常常在本身公司系統中整合一些合做夥伴的系統,如此打包銷售更有市場競爭力,這樣首要解 決的問題也是登陸入口統一;現在行業軟件現狀,不像十年前了只有那麼一兩套系統,講究着用就好了,如今沒有用上十來個系統就不叫信息化了,因此你能提供一 個單點登陸的解決方案也是一大賣點;再就是如今的軟件公司無論大小靠一個產品就能生存的很難了,基本都是最大化的挖掘客戶的需求,最好能提供一整套的解決 方案,這些系統能總體銷售更好,而單個產品銷售也得支持。因此無論是客戶的需求仍是內部的產品都會存在系統間整合的問題,而利用單點登陸至少能解決用戶統 一驗證的問題;框架

2.具體代碼

1.登陸模塊ui

 

        /// <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和有效性spa

         //<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類中的相關方法orm

 

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;
        }

       
    }

 以上是核心地方,因此貼出來。 若有問題,請下載源碼  查看詳細!~blog

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息