C# 單點登入

來源:互聯網
上載者:User

標籤: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# 單點登入

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.