예제 #1
0
        /// <summary>
        /// 验证Token
        /// </summary>
        /// <param name="playload"></param>
        /// <param name="cacheToken"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        private static bool Check(JWTPlayloadInfo playload, string cacheToken, string token)
        {
            if (string.IsNullOrEmpty(cacheToken))
            {
                return(false);
            }

            if (string.IsNullOrEmpty(token))
            {
                return(false);
            }

            if (!cacheToken.Equals(token))
            {
                return(false);
            }

            //Token过期
            DateTime exp = playload.exp.TryToInt64().TimeStamp2DateTime();

            if (DateTime.Now > exp)
            {
                if (!string.IsNullOrEmpty(playload.aud) && playload.aud.Equals(JWTPlayloadInfo.DefaultAud))
                {
                    CacheFactory.GetCache().Remove("JWT:JWT_TokenCacheKey:Guest");
                }
                else
                {
                    CacheFactory.GetCache().Remove(string.Format("JWT:JWT_TokenCacheKey:{0}", playload.aud));
                }
                return(false);
            }
            return(true);
        }
예제 #2
0
        /// <summary>
        /// 如果Token过期,则马上重新计算
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="account"></param>
        public static string CheckTokenHasExpiry(string userId, string account)
        {
            string token = String.Empty;

            if (!string.IsNullOrEmpty(userId) && userId.Equals(JWTPlayloadInfo.DefaultAud))
            {
                JWTPlayloadInfo playload = new JWTPlayloadInfo
                {
                    iss    = JWTPlayloadInfo.DefaultIss,
                    sub    = account,
                    aud    = userId,
                    extend = "PUBLIC_TOKEN"
                };
                token = GetToken(playload);
            }
            else
            {
                JWTPlayloadInfo playload = new JWTPlayloadInfo
                {
                    iss    = JWTPlayloadInfo.DefaultIss,
                    sub    = account,
                    aud    = userId,
                    extend = "USER_TOKEN"
                };
                token = GetToken(playload);
            }

            return(token);
        }
예제 #3
0
        /// <summary>
        /// Token校验
        /// </summary>
        /// <param name="token"></param>
        /// <param name="jwtPlayloadInfo"></param>
        /// <returns></returns>
        public static bool CheckToken(string token, out JWTPlayloadInfo jwtPlayloadInfo)
        {
            if (string.IsNullOrEmpty(token))
            {
                jwtPlayloadInfo = default(JWTPlayloadInfo);
                return(false);
            }

            IJsonSerializer   serializer = new JsonNetSerializer();
            IDateTimeProvider provider   = new UtcDateTimeProvider();
            IJwtValidator     validator  = new JwtValidator(serializer, provider);

            IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
            IJwtDecoder       decoder    = new JwtDecoder(serializer, validator, urlEncoder);

            //获取私钥
            string secret = GetPrivateKey();

            try
            {
                JWTPlayloadInfo playload = decoder.DecodeToObject <JWTPlayloadInfo>(token, secret, true);
                if (playload != null)
                {
                    if (!string.IsNullOrEmpty(playload.aud) && playload.aud.Equals(JWTPlayloadInfo.DefaultAud))
                    {
                        string cacheToken = CacheFactory.GetCache().Get <string>("JWT:JWT_TokenCacheKey:Guest");

                        jwtPlayloadInfo = playload;
                        return(Check(playload, cacheToken, token));
                    }
                    else
                    {
                        string cacheToken = CacheFactory.GetCache().Get <string>(string.Format("JWT:JWT_TokenCacheKey:{0}", playload.aud));

                        jwtPlayloadInfo = playload;
                        return(Check(playload, cacheToken, token));
                    }
                }
                else
                {
                    jwtPlayloadInfo = default(JWTPlayloadInfo);
                    return(false);
                }
            }
            catch (Exception e)
            {
                jwtPlayloadInfo = default(JWTPlayloadInfo);
                return(false);
            }
        }
예제 #4
0
        /// <summary>
        /// 签发Token
        /// </summary>
        /// <param name="playload">载荷</param>
        /// <returns></returns>
        public static string GetToken(JWTPlayloadInfo playload)
        {
            string token = String.Empty;

            if (playload != null)
            {
                IJwtAlgorithm     algorithm  = new HMACSHA256Algorithm();
                IJsonSerializer   serializer = new JsonNetSerializer();
                IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                IJwtEncoder       encoder    = new JwtEncoder(algorithm, serializer, urlEncoder);

                //设置过期时间
                TimeSpan time = TimeSpan.FromHours(24);
                playload.exp = DateTime.Now.AddHours(24).DateTime2TimeStamp().ToString();
                Dictionary <string, object> dict = playload.Object2Dictionary();
                //获取私钥
                string secret = GetPrivateKey();
                //将Token保存在缓存中
                if (!string.IsNullOrEmpty(playload.aud) && playload.aud.Equals(JWTPlayloadInfo.DefaultAud))
                {
                    //计算公用Token
                    token = CacheFactory.GetCache().Get("JWT:JWT_TokenCacheKey:Guest", () =>
                    {
                        return(encoder.Encode(dict, secret));
                    }, time);
                }
                else
                {
                    //计算Token
                    token = CacheFactory.GetCache().Get(string.Format("JWT:JWT_TokenCacheKey:{0}", playload.aud), () =>
                    {
                        return(encoder.Encode(dict, secret));
                    }, time);
                }
            }
            return(token);
        }